这是一个很难解释的问题:
我有一个DataGrid和一个(Xceed库)DataGrid.ItemsSource的值定义了IntegerUpDown中的项数,因此定义了DataGrid中的行数。
DataGrid.ItemsSource是一个ObservableCollection(NPoint),,其中NPoint具有、X、和Y (都是doubles)的属性。这意味着,如果用户在DataGrid中插入非数字值,则验证失败,并出现带有红色框和感叹号的标准DataGrid模板。而且,在纠正此错误之前,DataGrid不允许对其内容进行进一步更改。
所有这些都很好。然而,我只是有一个想法,并做了一个实验。如果用户删除最后一行的单元格的内容(这将应用值为ValidationError空),从而导致IntegerUpDown值,然后更改IntegerUpDown值以删除该无效行,怎么办?这是否释放了DataGrid,允许用户编辑其他单元格,还是DataGrid继续阻塞?
所以我就这么做了,DataGrid继续冻结。用户可以移动到其他单元格,但不能编辑它们。即使再次修改IntegerUpDown以替换已删除的行,DataGrid也不允许编辑。
这里有一本简单的故事书,说明我的意思(点击获取更大的图像):

这是相关代码。赋予行的特殊样式是因为,取决于窗口的其他部分,列(或仅部分行)可能是只读的。DataGrid.ItemsSource的绑定是在代码隐藏中完成的,因为根据窗口其他部分的状态不同,源也不同。您还会注意到,虽然出现了两列,但下面的DataGrid代码只包含一个列。这是因为它实际上是两个不同的.ItemsSource DataGrids,一个相邻,每个列都有一个列,因为每个列的DataGrids是不同的。
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);
}
}那么,如何解决这一问题呢?我认为,由于验证只发生在编辑上,所以没有注意到有罪的编辑不再存在(因为它被删除了,而不是编辑掉了),因此正在阻止任何进一步的编辑。是否有一种方法要求“请重新验证所有这些数据?”
发布于 2014-06-11 17:30:19
经过进一步的搜索,我找到了this solution。实际上还有其他一些地方在问同样的问题,但当我问这个问题时,我并没有使用必要的搜索词,即HasCellValidationError属性(它没有出现在MSDN文档中)。我在这里发布这篇文章,只是为了供其他人参考。
https://stackoverflow.com/questions/24042455
复制相似问题