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 Collapsed
en 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 Visibility
solo 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

Luis es un experto en Inteligência Empresarial, Redes de Computadores, Gestão de Dados e Desenvolvimento de Software. Con amplia experiencia en tecnología, su objetivo es compartir conocimientos prácticos para ayudar a los lectores a entender y aprovechar estas áreas digitales clave.