WPF数据表格样式错误IDataErrorInfo

3
我正在使用MVVM,有一个带有可编辑列的数据表格需要我进行验证:
<DataGridTemplateColumn Header="Key" Width="80">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Key}" />
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <vw:NumericTextBox Text="{Binding Key, Mode=TwoWay,ValidatesOnDataErrors=True,UpdateSourceTrigger=PropertyChanged}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>
            </DataGridTemplateColumn>

我已经添加了样式以将错误显示为工具提示:

我已经添加了样式以将错误显示为工具提示:

<Style TargetType="{x:Type DataGridCell}">
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self},Path=(Validation.Errors).CurrentItem.ErrorContent}"/>
        </Trigger>
    </Style.Triggers>
</Style>

所以验证被触发,单元格被用红色轮廓线圈出来并显示错误信息工具提示。
我有两个问题。首先,当用户点击单元格后,单元格仍然用红色轮廓线圈出,但悬停时不显示工具提示。我该如何解决?第二个问题是,在行旁边有一个橙色的感叹号,我不想要它。我猜这是因为网格或行上的某些默认样式所致。我该如何去掉它(红色轮廓很好)?

Eduardo回答了第二部分,感谢他。对于工具提示,我最终将TextBlock的工具提示属性绑定到验证错误,并摆脱了上面针对DataGridCell的样式。我尝试使用TargetType为TextBlock的样式来实现它,但是工具提示没有显示。我认为我可能需要将相对源设置为不同的内容,但我不知道应该设置什么。 - Nix
2个回答

3
为了去掉感叹号,你需要像这样编辑datagrid rowsytyle:

<DataGrid ...> 
<DataGrid.RowStyle> 
    <Style TargetType="DataGridRow"> 
        <Setter Property="ValidationErrorTemplate" Value="{x:Null}"/> 
    </Style> 
</DataGrid.RowStyle> 
<!-- ... --> 
</DataGrid> 

2

首先,为了在悬停时显示错误信息,您需要同样为TextBlock目标类型设置工具提示属性。我使用以下两种样式来显示IDataErrorInfo中的单元格编辑错误以及悬停错误。

<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>

为您的数据网格设置这些样式

<DataGridTextColumn .....
EditingElementStyle="{StaticResource EditCellStyleError}" ElementStyle="{StaticResource CellStyleError}"
</DataGridTextColumn>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接