【问题标题】:Accessing Validation Errors in a UserControl访问用户控件中的验证错误
【发布时间】:2015-05-12 12:39:53
【问题描述】:

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

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

没问题,我想,让我使用在其他地方也行得通的策略。我添加了一个触发器:

    <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 - UserControl 内的元素验证失败,而不是 UserControl 本身。

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

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

【问题讨论】:

    标签: c# wpf validation xaml user-controls


    【解决方案1】:

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

    实现看起来像这样:

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

    您可以阅读更多关于它的信息here

    【讨论】:

      【解决方案2】:

      Button.IsEnabled 属性已经硬连接到 RelayCommandCanExecute 方法,因此您只需在表单字段无效时将该返回值设置为 false

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

      现在,如何将bool areFormFieldsValid 变量设置为truefalse 取决于您...有几种方法可以做到这一点。就个人而言,我更喜欢使用IDataErrorInfo interface,它有一个方便的Error 属性,您可以查看它。网上有很多关于如何实现的教程,这里不再赘述……不过,最终的结果是这样的:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-15
        • 2015-10-12
        • 2021-08-13
        • 2013-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-27
        相关资源
        最近更新 更多