Могут ли значения триггера WPF сохраняться за пределами условия триггера? - PullRequest
2 голосов
/ 31 мая 2010

У меня проблема с триггерами WPF. В моем приложении я использовал мультитриггер, но хотел бы добиться того, чтобы изменения, сделанные, когда условия триггера становились истинными, сохранялись, а НЕ аннулировались, когда условия триггера снова становились ложными. Можно ли реализовать то, что я хочу?

Заранее спасибо.

1 Ответ

3 голосов
/ 05 июня 2010

Триггеры не имеют никакой памяти: как только триггер становится неприменимым, сеттеры триггера не применяются. Вы хотите условие, которое «блокируется», как только оно было установлено. Это можно сделать с помощью очень простого и универсального кода.

Сначала вам нужно прикрепленное свойство, которое вы можете "заблокировать". Вот простой класс со вложенным свойством IsLocked, которое становится истинным всякий раз, когда свойство DoLock установлено и остается таким же с тех пор:

public class LockingProperty : DependencyObject
{
  // IsLocked
  public static bool GetIsLocked(DependencyObject obj) { return (bool)obj.GetValue(IsLockedProperty); }
  public static void SetIsLocked(DependencyObject obj, bool value) { obj.SetValue(IsLockedProperty, value); }
  public static readonly DependencyProperty IsLockedProperty = DependencyProperty.RegisterAttached("IsLocked", typeof(bool), typeof(LockingProperty));

  // DoLock
  public static bool GetDoLock(DependencyObject obj) { return (bool)obj.GetValue(DoLockProperty); }
  public static void SetDoLock(DependencyObject obj, bool value) { obj.SetValue(DoLockProperty, value); }
  public static readonly DependencyProperty DoLockProperty = DependencyProperty.RegisterAttached("DoLock", typeof(bool), typeof(LockingProperty), new PropertyMetadata
  {
    PropertyChangedCallback = (obj, e) => { SetIsLocked(obj, true); }
  });
}

Теперь вы можете эмулировать блокирующий триггер, используя два отдельных триггера:

<Triggers>
  <Trigger ... your trigger conditions here ...>
    <Setter Property="my:LockingProperty.DoLock" Value="true" />
  </Trigger>
  <Trigger Property="my:LockingProperty.IsLocked" Value="true" />
    ... your setters here ...
  </Trigger>
</Triggers>

Обратите внимание, что первым триггером в этом примере может быть Trigger, DataTrigger, MultiTrigger или MultiDataTrigger - все, что вам нужно для выражения условия запуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...