DataGrid上的验证

时间:2015-03-10 08:48:33

标签: c# wpf xaml

我有一个在我的xaml中显示ObservableCollection的数据网格。我对其中一列的验证规则之一是"名称不能为空白"当“名称”字段为空时。一切正常。

我的问题是,当我的名字字段验证被触发时(如果名称为空白),名称字段用红色框勾勒出来。想象一下,在这个阶段,用户填写一个名称,但即使您单击同一行的其他字段,红色框仍然保留。只有当用户点击不同的行时,红色框才会消失。当用户点击同一行的不同字段时,有没有办法让红框消失?

我的姓名字段的xaml是

<Window.Resources>
    <Style x:Key="EditCellStyleError" TargetType="{x:Type TextBox}">
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
        </Trigger>
    </Style.Triggers>
    </Style>
    <Style x:Key="CellStyleError" TargetType="{x:Type TextBlock}">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="true">
                <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

名称字段

<DataGridTextColumn Header="Name" Binding="{Binding Name,ValidatesOnDataErrors=True, NotifyOnValidationError=True, ValidatesOnExceptions=True}" EditingElementStyle="{StaticResource EditCellStyleError}" ElementStyle="{StaticResource CellStyleError}"/>

2 个答案:

答案 0 :(得分:1)

我认为您需要将UpdateSourceTrigger添加到绑定

例如

<DataGridTextColumn Header="Name" 
  Binding="{Binding Name,ValidatesOnDataErrors=True, NotifyOnValidationError=True,
  ValidatesOnExceptions=True,  UpdateSourceTrigger=LostFocus}" />

这里我使用了LostFocus,但PropertyChanged可能是一个选项

答案 1 :(得分:0)

UpdateSourceTrigger = PropertyChanged肯定有帮助。另一个问题是摆脱红色感叹号。为此,我添加了一个空白的Rowvalidationtemplate

        <DataGrid.RowValidationErrorTemplate>
            <ControlTemplate>
            </ControlTemplate>
        </DataGrid.RowValidationErrorTemplate>