Вы можете объединить присоединенное поведение с присоединенным свойством, чтобы сделать это. Прикрепленное поведение ObserveFocus
подпишется на событие GotFocus
, а в обработчике события установите HasHeldFocus
Присоединенное свойство на True
Это может быть использовано для установки свойства в ViewModel, как это
<Button local:HasHeldFocusBehavior.ObserveFocus="True"
local:HasHeldFocusBehavior.HasHeldFocus="{Binding HasHeldFocus,
Mode=OneWayToSource}"/>
Вот пример того, как его можно использовать для изменения Background
Button
после его фокусировки
<Style TargetType="Button">
<Setter Property="Background" Value="Red"/>
<Setter Property="local:HasHeldFocusBehavior.ObserveFocus" Value="True"/>
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Self},
Path=(local:HasHeldFocusBehavior.HasHeldFocus)}"
Value="True">
<Setter Property="Background" Value="Green"/>
</DataTrigger>
</Style.Triggers>
</Style>
HasHeldFocusBehavior
public static class HasHeldFocusBehavior
{
public static readonly DependencyProperty ObserveFocusProperty =
DependencyProperty.RegisterAttached("ObserveFocus",
typeof(bool),
typeof(HasHeldFocusBehavior),
new UIPropertyMetadata(false, OnObserveFocusChanged));
public static bool GetObserveFocus(DependencyObject obj)
{
return (bool)obj.GetValue(ObserveFocusProperty);
}
public static void SetObserveFocus(DependencyObject obj, bool value)
{
obj.SetValue(ObserveFocusProperty, value);
}
private static void OnObserveFocusChanged(DependencyObject dpo,
DependencyPropertyChangedEventArgs e)
{
UIElement element = dpo as UIElement;
element.Focus();
if ((bool)e.NewValue == true)
{
SetHasHeldFocus(element, element.IsFocused);
element.GotFocus += element_GotFocus;
}
else
{
element.GotFocus -= element_GotFocus;
}
}
static void element_GotFocus(object sender, RoutedEventArgs e)
{
UIElement element = sender as UIElement;
SetHasHeldFocus(element, true);
}
private static readonly DependencyProperty HasHeldFocusProperty =
DependencyProperty.RegisterAttached("HasHeldFocus",
typeof(bool),
typeof(HasHeldFocusBehavior),
new UIPropertyMetadata(false));
public static void SetHasHeldFocus(DependencyObject element, bool value)
{
element.SetValue(HasHeldFocusProperty, value);
}
public static bool GetHasHeldFocus(DependencyObject element)
{
return (bool)element.GetValue(HasHeldFocusProperty);
}
}
Обновление
В вашем случае вы можете заменить Validation.HasError
Trigger на MultiTrigger
<Style TargetType="Control">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.HasError)}"
Value="True"/>
<Condition Binding="{Binding RelativeSource={RelativeSource Self},
Path=(local:HasHeldFocusBehavior.HasHeldFocus)}"
Value="True"/>
</MultiDataTrigger.Conditions>
<!-- Setters.. -->
</MultiDataTrigger>
<!-- ... -->
</Style.Triggers>
</Style>