WPF Datatrigger no dispara cuando se espera
wpf button triggers (2)
Tengo el siguiente 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>
El primer bloque de texto cambia felizmente con SelectedItems.Count, mostrando 0,1,2, etc. El datatrigger en el segundo bloque no parece disparar para cambiar el texto.
¿Alguna idea?
Alternativamente, puede reemplazar su XAML con esto:
<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>
Los convertidores pueden resolver muchos problemas vinculantes, pero tener muchos convertidores especializados se vuelve muy complicado.
El DataTrigger se está disparando pero el campo de texto para su segundo TextBlock está codificado como "elementos seleccionados" por lo que no podrá cambiar. Para verlo disparar, puede eliminar Texto = "elementos seleccionados".
Su problema es un buen candidato para usar un ValueConverter en lugar de DataTrigger . A continuación, le mostramos cómo crear y utilizar ValueConverter para que configure el texto a su gusto.
Crea 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
}
Agregue la referencia del espacio de nombres a su ensamblaje en el que se encuentra el convertidor:
xmlns:local="clr-namespace:ValueConverterExample"
Agregue el convertidor a sus recursos:
<Window.Resources>
<local:CountToSelectedTextConverter x:Key="CountToSelectedTextConverter"/>
</Window.Resources>
Cambia tu segundo bloque de texto a:
<TextBlock Text="{Binding ElementName=EditListBox, Path=SelectedItems.Count, Converter={StaticResource CountToSelectedTextConverter}}"/>