WPF Datatrigger не запускается, когда ожидалось
-
01-07-2019 - |
Вопрос
У меня есть следующий 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>
Первый текстовый блок благополучно изменяется с помощью SelectedItems.Количество, показывающее 0,1,2 и т.д.datatrigger во втором блоке, похоже, никогда не запускается для изменения текста.
Есть какие-нибудь мысли?
Решение
DataTrigger запускается, но текстовое поле для вашего второго текстового блока жестко запрограммировано как "выбранные элементы", поэтому оно не сможет измениться.Чтобы увидеть, как он срабатывает, вы можете удалить Text="выбранные элементы".
Ваша проблема является хорошим кандидатом для использования Преобразователь значений вместо того, чтобы Манипулятор данными.Вот как создать и использовать ValueConverter, чтобы заставить его придать тексту то, что вы хотите.
Создайте этот 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
}
Добавьте ссылку на пространство имен в вашу сборку, в которой находится конвертер:
xmlns:local="clr-namespace:ValueConverterExample"
Добавьте конвертер к своим ресурсам:
<Window.Resources>
<local:CountToSelectedTextConverter x:Key="CountToSelectedTextConverter"/>
</Window.Resources>
Измените свой второй текстовый блок на:
<TextBlock Text="{Binding ElementName=EditListBox, Path=SelectedItems.Count, Converter={StaticResource CountToSelectedTextConverter}}"/>
Другие советы
В качестве альтернативы, вы могли бы заменить свой XAML следующим образом:
<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>
Конвертеры могут решить множество проблем со связыванием, но наличие большого количества специализированных конвертеров становится очень запутанным делом.