WPF Datatrigger не запускается, когда ожидалось

StackOverflow https://stackoverflow.com/questions/94177

  •  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>

Конвертеры могут решить множество проблем со связыванием, но наличие большого количества специализированных конвертеров становится очень запутанным делом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top