Às vezes, você pode estar enfrentando um problema de ter que alternar entre várias apresentações com base em alguma condição. Por exemplo, você pode exibir a mesma lista de itens de maneira diferente, dependendo se o Multi-Select está ativado ou não.
A maneira mais fácil e mais óbvia de conseguir isso é vincular o Visibility
propriedade dos elementos para que um seja mostrado enquanto o outro é colapso ou oculto. No entanto, essa abordagem tem um custo.
Desvantagens da visibilidade da troca
Alterando o valor do Visibility
A propriedade tende a fazer o trabalho, mas possui algumas desvantagens perceptíveis:
- Você tem que usar um conversor para transformar o valor limitado em
Visibility
- Fica complicado quando há mais de duas apresentações para alternar entre ou quando há mais de uma condição
- Mesmo quando desmoronado ou escondido, todos os elementos da interface do usuário ainda permanecem na árvore visual
O último ponto é algo que tende a ser esquecido e pode levar a problemas. Quando você tornar um elemento invisível, seja definindo o Visibility
para Hidden
ou Collapsed
na verdade não desaparece da árvore visual. Isso significa que ainda participa da maioria das interações, incluindo ligações. Além disso, se um elemento oculto tiver uma ligação que falhar, uma exceção será levantada e silenciosamente suprimida pela estrutura, potencialmente causando problemas de desempenho.
Usando contentPresenter
Para resolver esse problema com mais eficiência, você pode usar ContentPresenter
em vez de. Esse controle pode alternar seu conteúdo usando gatilhos predefinidos e modelos de dados.
Aqui está um exemplo de como uma configuração típica pode 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>
Aqui ligamos o Content
propriedade para o atual DataContext
para que possa ser acessado pelos modelos de dados.
O ContentPresenter.Resources
Lista os modelos de dados usados para cada apresentação separada – nesse caso, é um ComboBox e uma caixa de listagem vinculada à mesma coleção. Para configurar qual modelo de dados é usado quando, declaramos um conjunto de gatilhos que verificam o valor do IsMultiselect
propriedade e trocar o ContentTemplate
de acordo.
Observe como o uso de gatilhos nos dá mais flexibilidade – não precisamos usar conversores para girar IsMultiselect
em um exemplo de Visibility
nós apenas ligamos a ele diretamente.
Usando essa abordagem, também não estamos deixando nenhuma bagunça desnecessária na árvore visual, porque estamos mudando o conteúdo real em vez de apenas escondê -lo. 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.