C# 访问UserControl中的验证错误

C# 访问UserControl中的验证错误,c#,wpf,validation,xaml,user-controls,C#,Wpf,Validation,Xaml,User Controls,我创建了一个WPF(.Net 4)UserControl,其中包含一些组合框和一个文本框。在XAML中,一些ValidationRules绑定到文本框。如果文本框包含无效数据,将显示一个红色框,并将工具提示设置为错误描述。效果很好 接下来,我在表单上放置了该UserControl的两个实例,并添加了一个按钮。在XAML中,按钮连接到ViewModel的RelayCommand。现在,我希望仅当两个UserControls都只包含有效数据时才启用该按钮 没问题,我想,让我用一种在其他地方有效的策略

我创建了一个WPF(.Net 4)UserControl,其中包含一些组合框和一个文本框。在XAML中,一些ValidationRules绑定到文本框。如果文本框包含无效数据,将显示一个红色框,并将工具提示设置为错误描述。效果很好

接下来,我在表单上放置了该UserControl的两个实例,并添加了一个按钮。在XAML中,按钮连接到ViewModel的RelayCommand。现在,我希望仅当两个UserControls都只包含有效数据时才启用该按钮

没问题,我想,让我用一种在其他地方有效的策略。我添加了一个触发器:

    <Button Content="_OK" ... Command="{Binding Path=OKCommand}">
        <Button.Style>
            <Style TargetType="{x:Type Button}">
                <Setter Property="IsEnabled" Value="false" />
                <Style.Triggers>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition Binding="{Binding ElementName=cascadingComboFrom, Path=(Validation.HasError)}" Value="false" />
                            <Condition Binding="{Binding ElementName=cascadingComboTo, Path=(Validation.HasError)}" Value="false" />
                        </MultiDataTrigger.Conditions>
                        <Setter Property="IsEnabled" Value="true" />
                    </MultiDataTrigger>
                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>

但是有一个问题:Validation.HasError对于UserControls总是false-对于UserControls内部的元素,而不是对于UserControls本身,验证失败

我知道我可以注册按钮的Click事件,使用中所示的方法检查按钮的有效性,并通过将RoutedEventArgs的Handled属性设置为true来防止执行RelayCommand。但这看起来更像WTF而不是WPF


你有什么建议?如何检索UserControl子项的验证错误?或者我如何在RelayCommand的CanExecute方法中获取它们?或者其他一些技巧?

您可以在命令绑定上设置一个名为
validatesOnDaerRors
的属性

实现将如下所示:

 <Button Content="_OK" Command="{Binding, Path=OKCommand, ValidatesOnDataErrors=True}"/>
private bool CanExecute(object commandParameter)
{
    return string.IsNullOrEmpty(yourDataObject.Error);
}


您可以阅读更多信息。

按钮。IsEnabled属性已硬连接到
RelayCommand
CanExecute
方法,因此当表单字段无效时,您只需将返回值设置为
false

private bool CanExecute(object commandParameter)
{
    return areFormFieldsValid;
}
现在,如何将
bool areFormFieldsValid
变量设置为
true
false
取决于您。。。有几种方法可以做到这一点。就个人而言,我更喜欢使用,它有一个方便的
Error
属性,您可以检查。有很多关于如何实现这一点的在线教程,所以我不会在这里重复。。。然而,最终的结果是这样的:

 <Button Content="_OK" Command="{Binding, Path=OKCommand, ValidatesOnDataErrors=True}"/>
private bool CanExecute(object commandParameter)
{
    return string.IsNullOrEmpty(yourDataObject.Error);
}