WPF启用/禁用按钮基于ItemsControl

时间:2017-01-16 16:04:03

标签: c# wpf validation

我正在尝试根据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>

问候!

1 个答案:

答案 0 :(得分:2)

我会使用基于属性的验证将验证推送到ViewModel,并检查验证状态,作为按钮CanExecute的{​​{1}}方法实现的一部分。

这提供了最大的灵活性,然后只需使用属性标记UI可编辑属性以进行验证,并使用简单的界面检查所有Command属性(包括任何基于嵌套集合的项)是否有效。

作为奖励,验证也可以进行单元测试。

对于集合,我通常使用ViewModel属性,其方法与正在验证的集合属性位于同一CustomValidation内。

如果您需要一个基本的工作示例,请查看此类和接口:

ViewModel

完整项目位于:WPF Project using attribute validation