我正在尝试根据ItemsControl中项目的验证结果设置按钮的启用状态(如果存在任何验证错误,用户不应该保存)。
我已成功完成了其他输入字段,如下所示:
<Style x:Key="SaveButtonStyle" TargetType="Button">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=MinValueTextBox, Path=(Validation.HasError)}" Value="True">
<Setter Property="IsEnabled" Value="False"/>
</DataTrigger>
</Style.Triggers>
</Style>
但是现在我还有一个ItemsControl绑定到一个集合,我希望以同样的方式验证它。 集合对象实现了IDataErrorInfo。
我怎么能这样做,因为我不能在按钮样式的DataTrigger中指定ElementName?
如果并非所有集合项的所有输入字段都有效,我想禁用保存按钮。
以下是带有DataTemplate的ItemsControl代码:
<ItemsControl ItemsSource="{Binding FeedTypes}" ItemTemplate="{StaticResource FeedTypeDataTemplate}"/>
<DataTemplate x:Key="FeedTypeDataTemplate">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="3*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="3*"/>
</Grid.ColumnDefinitions>
<Label Content="{x:Static p:Resources.FeedTypeNameLabel}"/>
<TextBox Name="FeedTypeNameTxtBox" Text="{Binding UpdateSourceTrigger=PropertyChanged, Path=Name,
ValidatesOnDataErrors=true, NotifyOnValidationError=true}" Grid.Column="1"/>
<Label Content="{x:Static p:Resources.KgPerLitreLabel}" Grid.Column="2"/>
<TextBox x:Name="FeedTypeKgPerLitreTxtBox" Text="{Binding UpdateSourceTrigger=PropertyChanged, Path=KgPerLitre,
ValidatesOnDataErrors=true, NotifyOnValidationError=true}" Grid.Column="3"/>
</Grid>
</DataTemplate>
问候!
答案 0 :(得分:2)
我会使用基于属性的验证将验证推送到ViewModel
,并检查验证状态,作为按钮CanExecute
的{{1}}方法实现的一部分。
这提供了最大的灵活性,然后只需使用属性标记UI可编辑属性以进行验证,并使用简单的界面检查所有Command
属性(包括任何基于嵌套集合的项)是否有效。
作为奖励,验证也可以进行单元测试。
对于集合,我通常使用ViewModel
属性,其方法与正在验证的集合属性位于同一CustomValidation
内。
如果您需要一个基本的工作示例,请查看此类和接口:
ViewModel