Conteúdo condicional Apresentando via WPF ContentPresenter • Oleksii Holub

Conteúdo condicional Apresentando via WPF ContentPresenter • Oleksii Holub

À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 Collapsedna 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 Visibilitynó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

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 *