【发布时间】: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