Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

Как установить Behavior через триггер

#c_sharp #wpf #xaml


Предположим, у меня есть некий контролл:





Нужно поставить ему Behavior, если триггер сработает, то есть по факту написать так:


    



Как это можно сделать? И можно ли вообще?
    


Ответы

Ответ 1



Можно вывернуть проблему: привязать behavior сразу, подписаться на IsVisibleChanged в behavior, а дальше то зачем вам это нужно class MyBehavior : Behavior { protected override void OnAttached() { base.OnAttached(); AssociatedObject.IsVisibleChanged += AssociatedObject_IsVisibleChanged; } protected override void OnDetaching() { base.OnDetaching(); AssociatedObject.IsVisibleChanged -= AssociatedObject_IsVisibleChanged; } void AssociatedObject_IsVisibleChanged(object sender, System.Windows.DependencyPropertyChangedEventArgs e) { //TODO: сделать что-нибудь } } xaml:

Ответ 2



Можно поступить следующим образом, добавьте в ваш класс поведения такое свойство зависимости: public static bool GetInject(DependencyObject obj) => (bool)obj.GetValue(InjectProperty); public static void SetInject(DependencyObject obj, bool value) => obj.SetValue(InjectProperty, value); public static readonly DependencyProperty InjectProperty = DependencyProperty.RegisterAttached("Inject", typeof(bool), typeof(MyBehavior), new PropertyMetadata(false, OnInject)); static void OnInject(DependencyObject d, DependencyPropertyChangedEventArgs e) { bool newValue = (bool)e.NewValue; var behaviours = Interaction.GetBehaviors(d); if (newValue) { behaviours.Add(new MyBehavior()); } else { foreach (var b in behaviours.OfType().ToList()) behaviours.Remove(b); } } Теперь, если установить Inject=true, это поведение применится автоматически. Сделайте это в вашем триггере: Взято из этого ответа @VladD.

Комментариев нет:

Отправить комментарий