Почему я не могу добавить DataTrigger в коллекцию триггеров моего элемента управления?

Почему я не могу написать такой код

<Border Width="130" Height="70">
    <Border.Triggers>
        <DataTrigger Binding="{Binding Path=CurrentStatus}" Value="0">
            <Setter Property="Style" Value="{StaticResource ResourceKey=ListBoxItemBorder}"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=CurrentStatus}" Value="200">
            <Setter Property="Style" Value="{StaticResource ResourceKey=ListBoxItemBorderInactive}"/>
        </DataTrigger>
    </Border.Triggers>
</Border>

Я получаю эту ошибку

Failed object initialization (ISupportInitialize.EndInit). 
Triggers collection members must be of type EventTrigger.  
Error at object '4_T' in markup file

Что я делаю не так, пожалуйста, помогите.

15
задан Tan 1 June 2016 в 19:31
поделиться

2 ответа

Абэ прав и хорошо объясняет ограничения. Одна вещь, которую вы, возможно, захотите рассмотреть, это:

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

Используйте один стиль на вашей границе, установщики этого стиля представляют ваши «нормальные» ' Посмотрите. Этот стиль также содержит ваш DataTrigger, а ваш DataTrigger имеет набор сеттеров, которые по существу представляют ваш второй стиль (которые имеют более высокий приоритет, чем стандартные сеттеры, когда этот триггер оценивается как true!

Изменить:

Что-то вроде этого -

<Style TargetType="Border" x:Key="BorderStyle">
    <!-- These setters are the same as your normal style when none of your triggers are true -->
    <Setter Property="BorderBrush" Value="Black" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=CurrentStatus}" Value="0">
            <!-- These setters are the same as your ListBoxItemBorder style -->
            <Setter Property="BorderBrush" Value="Green" />
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=CurrentStatus}" Value="200">
            <!-- These setters are the same as your ListBoxItemBorderInactive style -->
            <Setter Property="BorderBrush" Value="Gray" />
        </DataTrigger>
    </Style.Triggers>
</Style>
31
ответ дан 1 December 2019 в 00:23
поделиться

К сожалению, непосредственно к элементам можно применять только Триггеры событий. Если вы хотите использовать Trigger или DataTrigger, они должны быть в Style, ControlTemplate или DataTemplate.

Судя по названиям ресурсов, это Border внутри ListBoxItem ControlTemplate. Вы можете легко переместить триггеры в коллекцию триггеров шаблона.

18
ответ дан 1 December 2019 в 00:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: