Отслеживать все события проверки - PullRequest
0 голосов
/ 17 октября 2019

Это довольно просто , чтобы проверить, есть ли у определенного контейнера или его дочерних элементов ошибки проверки. Это можно использовать для отключения кнопки Сохранить .

Я могу использовать таймер

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 Ответ

1 голос
/ 17 октября 2019

То, как я обычно обращаюсь с этим, иллюстрируется здесь:

https://social.technet.microsoft.com/wiki/contents/articles/28597.aspx

Ошибка будет отправлена ​​в контейнер, и вы можете справиться с этим, использовать поведение или команду, чтобы передать егомодель представления.

Как:

<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 для любых привязок.

...