C# 错位数据网格错误指示器

C# 错位数据网格错误指示器,c#,.net,wpf,wpfdatagrid,C#,.net,Wpf,Wpfdatagrid,我试图使用DataGrid让用户能够输入新记录。 ItemsSource绑定到ObservableCollection。 MyObject实现了IDataErrorInfo进行验证,并对INotifyPropertyChanged进行了更改,以向UI通知PropertyChanged 问题: 我怎样才能克服以下问题 问题: 在编辑模式下,当我在单元格中键入一个长错误字符串时,文本框周围将显示错误指示器红色边框,但离开单元格时,指示器将溢出以覆盖其他列,如下所示: XAML: 注: 我认为所有这些

我试图使用DataGrid让用户能够输入新记录。 ItemsSource绑定到ObservableCollection。 MyObject实现了IDataErrorInfo进行验证,并对INotifyPropertyChanged进行了更改,以向UI通知PropertyChanged

问题:

我怎样才能克服以下问题

问题:

在编辑模式下,当我在单元格中键入一个长错误字符串时,文本框周围将显示错误指示器红色边框,但离开单元格时,指示器将溢出以覆盖其他列,如下所示:

XAML:

注:

我认为所有这些都是非常典型的,应该是直截了当的,但我的经验是DataGrid非常麻烦。以下是我解决此问题的步骤:

已删除的ValidationErrorTemplate

分别显式定义ElementStyle和EditingElementStyle,并在的ElementStyle中设置Mode=TwoWay

已从ElementStyle中删除ValidateSondaerRors=True,以允许用户在当前单元格中出现错误时编辑任何其他单元格

定义了MultiDataTrigger,用于在单元格值为Null时将BorderBrush设置为红色,以显示空单元格的错误指示器


我可能会改用ItemsControl,但我确实喜欢DataGrid的一些内置功能

看起来这是一个rant+5类问题。您已经直接问了其中一个问题。请将此问题分解为单独的问题,每个问题都有代码示例。@RQDQ,谢谢,但我的问题是关于为什么DataGrid在一般情况下会有如此大的问题。对于我指出的每一个问题,我都有解决方案。@Bolu验证是我唯一不喜欢WPF的东西。算了吧,它只会让你头痛。就我个人而言,我已经基于ViewModel级别的附加属性和验证创建了自己的验证框架,而不是在绑定级别,它工作得非常好,没有您在这里描述的任何问题。@HighCore,我也在ViewModel级别进行验证,但仍然在视图中使用默认的ValidatingTemplate,我想这些头痛的根源是什么?@Bolu整个事情一团糟。它迫使您的{Binding}使用更加详细的语法,这不必要地污染了您的XAML。我宁愿使用一个附加属性来修改CellTemplate或类似的东西的视觉外观,并将绑定保持为{Binding MyProperty}的默认语法。
<DataGrid VerticalAlignment="Top" Margin="0,5"  CanUserAddRows="True"  AutoGenerateColumns="False"  ItemsSource="{Binding Pricelist}" >
    <DataGrid.CellStyle>
        <Style TargetType="DataGridCell">
            <Setter Property="BorderThickness" Value="0"/>
            <Setter Property="Validation.ErrorTemplate" Value="{x:Null}"/>
        </Style>
    </DataGrid.CellStyle>
    <DataGrid.Columns>
        <DataGridTextColumn Header="Price" Width="60" >
            <DataGridTextColumn.ElementStyle>
                <Style TargetType="TextBlock">                            
                    <Setter Property="Text" Value="{Binding Price, Mode=TwoWay}"/>
                </Style>
            </DataGridTextColumn.ElementStyle>
            <DataGridTextColumn.EditingElementStyle>
                <Style TargetType="TextBox">
                    <Setter Property="Text" Value="{Binding Price, ValidatesOnDataErrors=True}"/>
                </Style>
            </DataGridTextColumn.EditingElementStyle>
        </DataGridTextColumn>                    
    </DataGrid.Columns>
</DataGrid>