我遇到WPF触发器问题。在我的应用程序中,我使用了多个触发器,但是想要实现当触发器的条件变为真时持续存在时所做的更改,并且当触发器的条件变为错误时不会失效。 是否有可能实现我想要的东西?
提前致谢。
答案 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 - 无论您需要表达什么触发条件。