Почему я не могу добавить DataTrigger в коллекцию триггеров моего элемента управления? - PullRequest
15 голосов
/ 26 августа 2010

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

<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

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

Ответы [ 3 ]

31 голосов
/ 26 августа 2010

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

Вместо двух стилей границ и попытки выбирать между ними на основе триггера ...

Используйте один стиль на вашей границе, этосеттеры стиля представляют ваш «нормальный» вид.Этот стиль также содержит ваш 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>
18 голосов
/ 26 августа 2010

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

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

0 голосов
/ 12 мая 2018

Вот способ без ограничений триггеров.

Пример:

 <Border Width="130" Height="100" Grid.Row="1">
        <ListBox x:Name="lstItems" ItemsSource="{Binding TestItems}">

        </ListBox>
        <tg:TriggerExtensions.Triggers>
            <tg:TriggerCollections>
                <tg:DataTriggerInfo Binding="{Binding CurrentStatus}" Value="0">
                    <tg:DataTriggerInfo.Setters>
                        <tg:SetterInfo ElementName="lstItems" Property="Style" Value="{StaticResource ListBoxRed}"/>
                    </tg:DataTriggerInfo.Setters>
                </tg:DataTriggerInfo>
                <tg:DataTriggerInfo Binding="{Binding CurrentStatus}" Value="0" IsInvert="True">
                    <tg:DataTriggerInfo.Setters>
                        <tg:SetterInfo ElementName="lstItems" Property="Style" Value="{StaticResource ListBoxBlue}"/>
                    </tg:DataTriggerInfo.Setters>
                </tg:DataTriggerInfo>
            </tg:TriggerCollections>
        </tg:TriggerExtensions.Triggers>
    </Border>

Ссылка Образец

Компонент связи Github

...