访问UserControl中的验证错误



我创建了一个wpf(.net 4)usercontrol,其中包含一些组合盒和一个文本框。在XAML中,某些验证记录绑定到文本框。如果文本框包含无效的数据,则显示一个红色帧,并将工具提示设置为错误描述。效果很好。

接下来,我将该UserControl的两个实例放在表单上,并添加了一个按钮。在XAML中,该按钮连接到ViewModel的继电器。现在,我希望仅在两个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>

但是有一个问题:验证。haserror对于UserControls来说总是错误的 - 验证因USERCONTROL内部的元素而不是使用USERCONTROL。

我知道我可以注册按钮的单击事件,使用检测WPF验证错误中显示的方法检查那里的有效性,并通过将RoutedEventArgs的处理属性设置为true,以防止执行中继命令。但这看起来比WPF更像WTF。

您建议什么?如何检索Usercontrol孩子的验证错误?还是如何通过中继命令的canecute方法获取它们?或其他一些技巧?

您可以在命令上设置属性,称为ValidatesOnDataErrors

实现将看起来像这样:

 <Button Content="_OK" Command="{Binding, Path=OKCommand, ValidatesOnDataErrors=True}"/>

您可以在这里阅读更多有关它的信息。

Button.IsEnabled属性已经很难连接到 RelayCommandCanExecute方法,因此,当表单字段无效时,您需要做的就是将返回值设置为 false

private bool CanExecute(object commandParameter)
{
    return areFormFieldsValid;
}

现在,如何将bool areFormFieldsValid变量设置为truefalse取决于您...有几种方法可以这样做。就个人而言,我更喜欢使用IDataErrorInfo接口,该接口具有便利的Error属性,您可以检查。有许多关于如何实施此操作的在线教程,所以我不会在这里重复一遍...但是,最终结果就是这样:

private bool CanExecute(object commandParameter)
{
    return string.IsNullOrEmpty(yourDataObject.Error);
}

最新更新