WPF触发值是否可以持续超出触发条件?

时间:2010-05-31 12:57:57

标签: wpf

我遇到WPF触发器问题。在我的应用程序中,我使用了多个触发器,但是想要实现当触发器的条件变为真时持续存在时所做的更改,并且当触发器的条件变为错误时不会失效。 是否有可能实现我想要的东西?

提前致谢。

1 个答案:

答案 0 :(得分:3)

触发器没有任何内存:一旦触发器不适用,触发器的设置器就不会被应用。您需要一个条件,一旦设置就“锁定”。这可以通过一个非常简单和通用的代码来完成。

首先,您需要一个可以“锁定”的附加属性。这是一个带有“IsLocked”附加属性的简单类,只要设置了“DoLock”属性并且从那时起就保持这种状态,它就变为true:

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 - 无论您需要表达什么触发条件。