Триггеры не имеют никакой памяти: как только триггер становится неприменимым, сеттеры триггера не применяются. Вы хотите условие, которое «блокируется», как только оно было установлено. Это можно сделать с помощью очень простого и универсального кода.
Сначала вам нужно прикрепленное свойство, которое вы можете "заблокировать". Вот простой класс со вложенным свойством 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 - все, что вам нужно для выражения условия запуска.