Триггер WPF Storyboard для свойства изменен

У меня есть DataTemplate для класса, реализующего INotifyPropertyChanged. Есть ли способ запустить раскадровку при изменении свойства и другой раскадровке с разными значениями (в данном случае это логическое значение)?

И есть ли способ запустить раскадровку при запуске в зависимости от значений класса, для которого создан шаблон данных?


person Peter    schedule 09.03.2009    source источник


Ответы (2)


Да, вы можете это сделать.

Добавьте DataTrigger и привяжите к соответствующему свойству. Вот пример:

<DataTemplate.Triggers>
    <DataTrigger Binding="{Binding Path=MyProperty}" Value="True">
        <BeginStoryboard Storyboard="{StaticResource myStoryboard}"/>
    </DataTrigger>
</DataTemplate.Triggers>

Вы можете установить значение для проверки на что угодно. Таким образом, вы можете настроить запуск раскадровки, когда ваше значение изменится на false. Вы можете добавить столько триггеров данных (или других триггеров), сколько хотите.

Обратите внимание, что в моем примере я ссылаюсь на фиктивное свойство и раскадровку.

При изменении свойства привязка будет обновлена ​​и сработает триггер из-за привязки данных.

Этот метод также должен работать при запуске.

person Josh G    schedule 09.03.2009
comment
будет ли это работать, даже если все значения установлены, когда список получает объект? - person Peter; 09.03.2009
comment
Я считаю, что раскадровка будет запущена, когда объект будет приобретен. Попробуйте и посмотрите. - person Josh G; 09.03.2009
comment
Где в xaml мы добавляем это? - person swinefeaster; 02.01.2012
comment
@swinefeaster: где угодно внутри DataTemplate. Согласно оригинальному плакату, он уже работает в DataTemplate. DataTemplates определяются как ресурсы либо локально в каком-либо компоненте, либо в верхней части UserControl. - person Josh G; 10.02.2015
comment
Для меня элемент <BeginStoryboard .. не принимается в элементе <DataTrigger ...: значение типа BeginStoryboard не может быть присвоено коллекции или словарю типа SetterBaseCollection (свободный перевод). Почему это? - person Nicolas; 16.11.2018

Подобно плакату выше, я также использовал DataTrigger, а затем привязал его к свойству в моей ViewModel. Единственное, что меня смутило, это то, где разместить триггер данных. Я поместил его прямо в корневой узел (т.е. в окно). Я создал его с помощью Expression Blend, который позаботился о деталях именования тегов для меня.

Также не забудьте включить в свой проект ссылку на "Microsoft.Expression.Interactions".

XAML: (это происходит непосредственно в корневом узле)

<Window
   xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
   xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions" 
   x:Name="window" >

    ...

    <i:Interaction.Triggers>
      <ei:DataTrigger Binding="{Binding FlashingBackground, Mode=OneWay}" Value="ON">
        <ei:ControlStoryboardAction Storyboard="{StaticResource MyAnimation}"     
                                                ControlStoryboardOption="Play"/>
      </ei:DataTrigger>
    </i:Interaction.Triggers>

    ...
</Window>

ViewModel:

 private void TurnOnFlashingBackround()
    {
        FlashingBackground = "ON";
    }

    private string _FlashingBackround = "OFF";

    public string FlashingBackground
    {
        get { return _FlashingBackround; }

        private set
        {
            if (FlashingBackground == value)
            {
                return;
            }

            _FlashingBackround = value;
            this.OnPropertyChanged("FlashingBackground");
        }
    }

    public new event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

Наконец, модель представления должна наследоваться от «INotifyPropertyChanged».

person CowboyBebop    schedule 12.05.2011
comment
На самом деле в этом примере используются триггеры Blend, которые сильно отличаются от встроенных триггеров WPF. При этом они называются одинаково. Просто разные пространства имен. В некотором смысле триггеры Blend можно считать «прикрепленными» триггерами, в то время как встроенные имеют очень специфические правила относительно того, где их можно разместить. - person Alex Paven; 13.05.2011