В итоге я создал класс, который будет содержать все свойства зависимостей проверки моих элементов управления:
public class ValidationProperties
{
#region IsValid Dependency Property
/// <summary>
/// An attached dependency property which provides an
/// </summary>
public static readonly DependencyProperty IsValidProperty;
/// <summary>
/// Gets the <see cref="IsValidProperty"/> for a given
/// <see cref="DependencyObject"/>, which provides an
/// </summary>
public static bool GetIsValid(DependencyObject obj)
{
return (bool)obj.GetValue(IsValidProperty);
}
/// <summary>
/// Sets the attached <see cref="IsValidProperty"/> for a given
/// <see cref="DependencyObject"/>, which provides an
/// </summary>
public static void SetIsValid(DependencyObject obj, bool value)
{
obj.SetValue(IsValidProperty, value);
}
#endregion IsValid Dependency Property
static ValidationProperties()
{
// Register attached dependency property
IsValidProperty = DependencyProperty.RegisterAttached("IsValid",
typeof(bool),
typeof(ValidationProperties),
new FrameworkPropertyMetadata(true));
}
}
После этого я изменил стиль для запуска анимации в зависимости от значения этого свойства для элемента управления, который использует стиль:
(...)
<Trigger Property="AttachedProperties:ValidationProperties.IsValid" Value="false">
<Trigger.EnterActions>
<BeginStoryboard Storyboard="{StaticResource ControlIsInvalid}"/>
</Trigger.EnterActions>
</Trigger>
(...)
Наконец, я связал свойство зависимости в элементе управления, который использует стиль, со значением в модели (через модель представления):
<TextBox x:Name="UsernameTextbox"
(...)
AttachedProperties:ValidationProperties.IsValid="{Binding SessionHandler.SessionUser.UsernameIsValid}"/>