C# WPF-删除带有验证的DataGridRow。错误阻止DataGrid

C# WPF-删除带有验证的DataGridRow。错误阻止DataGrid,c#,wpf,xaml,datagrid,C#,Wpf,Xaml,Datagrid,这是一个很难解释的问题: 我有一个DataGrid和一个(Xceed库)IntegerUpDown。IntegerUpDown的值定义了数据网格中的项数。ItemsSource因此定义了数据网格中的行数 DataGrid.ItemsSource是一个可观察集合(NPoint),其中NPoint具有X和Y(两者都是双倍的)。这意味着,如果用户在数据网格中插入非数字值,则验证失败,并显示带有红色框和感叹号的标准验证错误模板。此外,在更正此错误之前,DataGrid不允许对其内容进行进一步更改 所有这

这是一个很难解释的问题:

我有一个DataGrid和一个(Xceed库)IntegerUpDownIntegerUpDown的值定义了数据网格中的项数。ItemsSource因此定义了数据网格中的行数

DataGrid.ItemsSource是一个可观察集合(NPoint),其中NPoint具有XY(两者都是双倍的)。这意味着,如果用户在数据网格中插入非数字值,则验证失败,并显示带有红色框和感叹号的标准验证错误模板。此外,在更正此错误之前,DataGrid不允许对其内容进行进一步更改

所有这些都很好。然而,我只是有了一个想法,做了一个实验。如果用户删除最后一行的单元格内容(将应用值null),导致验证错误,然后更改整数下降值以删除无效行,该怎么办?这是否释放了数据网格,允许用户编辑其他单元格,或者数据网格是否继续被阻塞

所以我就这么做了,数据网格继续冻结。用户可以移动到其他单元格,但不能编辑它们。即使再次更改IntegerUpDown以替换删除的行,DataGrid也不允许编辑

这是一本简单的故事书,讲述了我的意思(点击查看大图): 1.窗口的初始状态 2.用户删除最后一行的内容,从而触发ValidationError 3.用户减少“#节”,删除导致ValidationError的最后一行 4.DataGrid的其余单元格仍无法编辑。 5.增加“#节”后,返回删除的行(现在新值为0,这是新行的默认值),其他单元格(包括新行)仍然无法编辑

这是相关代码。为行指定的特殊样式是因为,根据窗口的其他部分,列(或仅部分行)可能是只读的。DataGrid.ItemsSource的绑定是在代码隐藏中完成的,因为根据窗口其他部分的状态,源不同。您还将注意到,尽管出现了两列,但下面的DataGrid代码只包含一列。这是因为它实际上是两个不同的数据网格,一个挨着另一个,每个都有一列,因为每个列的.ItemsSource是不同的

XAML

<Grid.Resources>
    <Style x:Key="ReadOnlyCheckX" TargetType="{x:Type DataGridRow}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsXReadOnly}" Value="True">
                <Setter Property="Tag" Value="ReadOnly" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Grid.Resources>
<!--...-->
<xctk:IntegerUpDown Name="nSections"
                    Minimum="3" Value="11"
                    ValueChanged="nSectionsChanged"/>
<!--...-->
<DataGrid x:Name="CoordinatesX"
          RowStyle="{StaticResource ReadOnlyCheckX}"
          AutoGenerateColumns="False"
          BeginningEdit="Coordinates_BeginningEdit">
    <DataGrid.Columns>
        <DataGridTextColumn x:Name="XColumn" Width="50"/>
    </DataGrid.Columns>
</DataGrid>

代码隐藏

private void Coordinates_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
{
    if ((e.Row).Tag != null && (e.Row).Tag as string == "ReadOnly")
        e.Cancel = true;
}
private void nSectionsChanged(object sender, RoutedEventArgs e)
{
    var cable = DataContext as Cable;
    var o = sender as IntegerUpDown;
    int v = (int)o.Value;
    if (v > cable.Points.Count)
    {
        for (int i = cable.Points.Count; i < v; i++)
            cable.Points.Add(new Point());
    }
    else if (v < cable.Points.Count)
    {
        for (int i = v; i < cable.Points.Count; )
            cable.Points.RemoveAt(v);
    }
}
private void坐标\u BeginningEdit(对象发送方,DataGridBeginningEditEventArgs e)
{
if((e.Row).Tag!=null&&(e.Row).tagasstring==“只读”)
e、 取消=真;
}
私有void nSectionsChanged(对象发送方,路由目标)
{
var cable=数据上下文作为电缆;
var o=发送方作为整数下降;
int v=(int)o.值;
如果(v>电缆点计数)
{
对于(int i=cable.Points.Count;i

那么,如何解决这个问题呢?我认为,由于验证只发生在编辑上,它没有注意到有罪的编辑不再存在(因为它被删除,而不是被编辑掉),因此阻止了任何进一步的编辑。有没有办法要求“请重新验证所有这些数据?”

经过进一步搜索,我发现。实际上还有其他一些地方也在问同样的问题,但当我问这个问题时,我没有使用基本的搜索词,即DataGridHasCellValidationError属性(在MSDN文档中没有出现)。我把这个贴在这里只是为了将来给别人参考