Мониторинг всех проверочных событий
Это довольно легко проверить, если определенный контейнер или его дети имеют ошибки проверки. Это можно использовать для отключения Save кнопки.
Я могу использовать таймер
public SomeUserControl()
{
InitializeComponent();
var timer = new DispatcherTimer
{
Interval = TimeSpan.FromMilliseconds(100),
IsEnabled = true
};
Loaded += (s, e) => buttonSave.IsEnabled = IsValid(grid);
Unloaded += (s, e) => timer.Stop();
}
опросить и отключить кнопку.
<!-- container with lots of controls, bindings and validations -->
<Grid x:Name="grid">
...
</Grid>
<!-- save button -->
<Button x:Name="buttonSave" ... />
Есть ли способ лучше? В идеале я хочу мероприятие. К сожалению, единственное событие, которое я обнаружил, событие Validation.Error, можно использовать только для самого элемента с привязками. Просматривать дочерние элементы и подписываться (не говоря уже о том, что мне приходится иметь дело с добавлением новых дочерних элементов) кажется намного хуже, чем опрос.
Мысли?
1 ответ
Вот как я с этим справляюсь:
https://social.technet.microsoft.com/wiki/contents/articles/28597.aspx
Событие errorevent переместится в контейнер, и вы можете справиться с этим, используя поведение или команду, чтобы передать его модели просмотра.
Подобно:
<ControlTemplate x:Key="AddingTriggers" TargetType="ContentControl">
<ControlTemplate.Resources>
<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource ErrorToolTip}">
<Setter Property="HorizontalAlignment" Value="Left"/>
</Style>
</ControlTemplate.Resources>
<StackPanel>
<i:Interaction.Triggers>
<local:RoutedEventTrigger RoutedEvent="{x:Static Validation.ErrorEvent}">
<e2c:EventToCommand Command="{Binding ConversionErrorCommand, Mode=OneWay}"
EventArgsConverter="{StaticResource BindingErrorEventArgsConverter}"
PassEventArgsToCommand="True" />
</local:RoutedEventTrigger>
</i:Interaction.Triggers>
<TextBlock Text="This would be some sort of a common header" Foreground="LightBlue" HorizontalAlignment="Right"/>
<ContentPresenter/> <!-- This is how you can have variable content "within" the control -->
<TextBlock Text="This would some sort of a common footer" Foreground="LightBlue" HorizontalAlignment="Right"/>
</StackPanel>
</ControlTemplate>
Вам нужно NotifyOnValidationError=True для любых привязок.