首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF -用DataGridRow块DataGrid去除DataGrid

WPF -用DataGridRow块DataGrid去除DataGrid
EN

Stack Overflow用户
提问于 2014-06-04 16:10:25
回答 1查看 2.1K关注 0票数 2

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

我有一个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也不允许编辑。

这里有一本简单的故事书,说明我的意思(点击获取更大的图像):

  1. 窗口2的初始状态。用户删除最后一行的内容,触发ValidationError 3。用户减少"#区段“,删除导致ValidationError 4的最后一行。DataGrid的其余单元格仍然无法编辑。5.在增加"#区段“后,返回已删除的行(现在的新值为0,这是新行的默认值),其他单元格(包括新行)仍然无法编辑。

这是相关代码。赋予行的特殊样式是因为,取决于窗口的其他部分,列(或仅部分行)可能是只读的。DataGrid.ItemsSource的绑定是在代码隐藏中完成的,因为根据窗口其他部分的状态不同,源也不同。您还会注意到,虽然出现了两列,但下面的DataGrid代码只包含一个列。这是因为它实际上是两个不同的.ItemsSource DataGrids,一个相邻,每个列都有一个列,因为每个列的DataGrids是不同的。

XAML

代码语言:javascript
复制
<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>

代码-幕后

代码语言:javascript
复制
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);
    }
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-11 17:30:19

经过进一步的搜索,我找到了this solution。实际上还有其他一些地方在问同样的问题,但当我问这个问题时,我并没有使用必要的搜索词,即HasCellValidationError属性(它没有出现在MSDN文档中)。我在这里发布这篇文章,只是为了供其他人参考。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24042455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档