Contenido condicional que presenta a través de WPF ContentPresenter • Oleksii Holub

Contenido condicional que presenta a través de WPF ContentPresenter • Oleksii Holub

A veces es posible que se enfrente a un problema de tener que cambiar entre múltiples presentaciones en función de alguna condición. Por ejemplo, es posible que desee mostrar la misma lista de elementos de manera diferente dependiendo de si MultiSelect está habilitado o no.

La forma más fácil y más obvia de lograr esto es unir el Visibility propiedad de los elementos para que uno se muestre mientras el otro se derrumba o oculta. Sin embargo, este enfoque tiene un costo.

Desventajas de la visibilidad de conmutación

Cambiar el valor del Visibility La propiedad tiende a hacer el trabajo, pero tiene algunos inconvenientes notables:

  • Tienes que usar un convertidor para convertir el valor unido en Visibility
  • Se complica cuando hay más de dos presentaciones para cambiar entre o cuando hay más de una condición
  • Incluso cuando se derrumban o oculta, todos los elementos de la interfaz de usuario aún permanecen en el árbol visual

El último punto es algo que tiende a pasar por alto y puede conducir a problemas. Cuando haga un elemento invisible, ya sea configurando el Visibility a Hidden o Collapseden realidad no desaparece del árbol visual. Esto significa que todavía participa en la mayoría de las interacciones, incluidos los enlaces. Además, si un elemento oculto tiene una unión que falla, el marco se elevará y suprimirá en silencio, lo que puede causar problemas de rendimiento.

Usar content presente

Para abordar este problema de manera más eficiente, puede usar ContentPresenter en cambio. Este control puede cambiar su contenido utilizando disparadores predefinidos y plantillas de datos.

Aquí hay un ejemplo de cómo una configuración típica puede parecer usar ContentPresenter:

<ContentPresenter Content="{Binding}">

    <!-- Presentations -->
    <ContentPresenter.Resources>
        <DataTemplate x:Key="ComboBoxPresenter">
            <ComboBox ItemsSource="{Binding Items}" IsReadOnly="True" />
        </DataTemplate>
        <DataTemplate x:Key="ListBoxPresenter">
            <ListBox ItemsSource="{Binding Items}" SelectionMode="Multiple" />
        </DataTemplate>
    </ContentPresenter.Resources>

    <!-- Triggers -->
    <ContentPresenter.Style>
        <Style TargetType="{x:Type ContentPresenter}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsMultiselect}" Value="False">
                    <Setter Property="ContentTemplate" Value="{StaticResource ComboBoxPresenter}" />
                </DataTrigger>
                <DataTrigger Binding="{Binding IsMultiselect}" Value="True">
                    <Setter Property="ContentTemplate" Value="{StaticResource ListBoxPresenter}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentPresenter.Style>

</ContentPresenter>

Aquí vinculamos el Content propiedad a la actual DataContext para que se pueda acceder a las plantillas de datos.

El ContentPresenter.Resources Enumera las plantillas de datos utilizadas para cada presentación separada: en este caso, es un comboBox y un cuadro de lista vinculado a la misma colección. Para configurar qué plantilla de datos se usa cuando, declaramos un conjunto de desencadenantes que verifican el valor del IsMultiselect propiedad y cambiar el ContentTemplate respectivamente.

Tenga en cuenta cómo el uso de disparadores nos da más flexibilidad: no necesitamos usar convertidores para girar IsMultiselect en una instancia de Visibilitysolo nos unimos directamente.

Usando este enfoque, tampoco estamos dejando ningún desastre innecesario en el árbol visual porque estamos cambiando el contenido real en lugar de simplemente ocultarlo. Solana Token Creator

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *