WPF - 使用Validation.Error删除DataGridRow阻止DataGrid

时间:2014-06-04 16:10:25

标签: c# wpf xaml datagrid

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

我有一个 DataGrid 和一个(Xceed库) IntegerUpDown IntegerUpDown 的值定义 DataGrid.ItemsSource 中的项目数,因此定义 DataGrid 中的行数。

DataGrid.ItemsSource ObservableCollection(NPoint),其中 NPoint 的属性 X Y (两者都是双打)。这意味着,如果用户在 DataGrid 中插入非数字值,则验证失败,并显示带有红色框和感叹号的标准 ValidationError 模板。此外,在纠正此错误之前,DataGrid不允许对其内容进行进一步更改。

所有这一切都很好。但是,我刚才有了一个想法并做了一个实验。如果用户删除最后一行的单元格内容(将应用 null 的值),导致 ValidationError ,然后更改 IntegerUpDown < / strong>值以便删除该无效行?这是否可以释放 DataGrid ,允许用户编辑其他单元格,还是 DataGrid 继续阻止?

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

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

以下是相关代码。赋予行的特殊样式是因为,根据窗口的其他部分,列(或只是某些行)可能是只读的。 DataGrid.ItemsSource 的绑定在代码隐藏中完成,因为根据窗口其他部分的状态,源不同。您还会注意到,虽然出现了两列,但下面的 DataGrid 代码只包含一列。这是因为它实际上是两个不同的 DataGrids ,一个紧挨着另一个,每个都有一列,因为每列的 .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);
    }
}

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

1 个答案:

答案 0 :(得分:1)

经过一番搜索后,我找到了this solution。实际上还有其他一些地方都在问同样的事情,但当我问这个问题时我没有使用基本的搜索词,即 DataGrid HasCellValidationError 属性(这不会出现在MSDN文档中)。我在这里张贴这篇文章仅供将来参考。