这是一个难以解释的问题:
我有一个 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 也不允许进行修改。
这是一本关于我的意思的简单故事书(点击查看大图): 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;
答案 0 :(得分:1)
经过一番搜索后,我找到了this solution。实际上还有其他一些地方都在问同样的事情,但当我问这个问题时我没有使用基本的搜索词,即 DataGrid 的 HasCellValidationError 属性(这不会出现在MSDN文档中)。我在这里张贴这篇文章仅供将来参考。