WPF DataTrigger não queima quando esperado
-
01-07-2019 - |
Pergunta
Eu tenho o seguinte XAML:
<TextBlock Text="{Binding ElementName=EditListBox, Path=SelectedItems.Count}" Margin="0,0,5,0"/>
<TextBlock Text="items selected">
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=EditListBox, Path=SelectedItems.Count}" Value="1">
<Setter Property="TextBlock.Text" Value="item selected"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
O primeiro bloco de texto feliz muda com SelectedItems.Count, mostrando 0,1,2, etc. O DataTrigger no segundo bloco nunca parece fogo para alterar o texto.
Qualquer pensamento?
Solução
O DataTrigger está disparando, mas o campo de texto para o seu segundo TextBlock é codificado como "itens selecionados" para que ele não será capaz de mudar. Para vê-lo disparar, você pode remover Text = "itens selecionados".
Seu problema é um bom candidato para usando um ValueConverter em vez de DataTrigger . Veja como criar e utilizar o ValueConverter para obtê-lo para definir o texto ao que você quer.
Crie este ValueConverter:
public class CountToSelectedTextConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if ((int)value == 1)
return "item selected";
else
return "items selected";
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
Adicionar a referência ao namespace para sua a montagem do conversor está localizado:
xmlns:local="clr-namespace:ValueConverterExample"
Adicionar o conversor para seus recursos:
<Window.Resources>
<local:CountToSelectedTextConverter x:Key="CountToSelectedTextConverter"/>
</Window.Resources>
Alterar sua segunda textblock a:
<TextBlock Text="{Binding ElementName=EditListBox, Path=SelectedItems.Count, Converter={StaticResource CountToSelectedTextConverter}}"/>
Outras dicas
Como alternativa, você poderia substituir o seu XAML com este:
<TextBlock Margin="0,0,5,0" Text="{Binding ElementName=EditListBox, Path=SelectedItems.Count}"/>
<TextBlock>
<TextBlock.Style>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Text" Value="items selected"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=EditListBox, Path=SelectedItems.Count}" Value="1">
<Setter Property="Text" Value="item selected"/>
</DataTrigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
Conversores pode resolver um monte de problemas de ligação, mas ter um monte de conversores especializados fica muito confuso.