Триггер раскадровки WPF при изменении свойства - PullRequest
3 голосов
/ 09 марта 2009

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

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

Ответы [ 2 ]

6 голосов
/ 09 марта 2009

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

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

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

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

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

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

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

1 голос
/ 12 мая 2011

Как и в предыдущем постере, я также использовал DataTrigger, а затем привязал его к свойству в моей модели представления. Одна вещь, которую я нашел сбивающей с толку, была то, куда поместить триггер данных. Я помещаю это непосредственно в корневой узел (то есть окно). Я создал его с помощью 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));
        }
    }

Наконец, Viewmodel должен наследоваться от "INotifyPropertyChanged"

...