Изменен триггер раскадровки WPF при изменении свойства

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

  •  06-07-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

Другие советы

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

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

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>

Видовая модель:

 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"

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