Datagrid CancelEdit不起作用

时间:2014-02-19 12:44:40

标签: c# wpf datagrid

我的DataGrid在XAML中定义:

<datagrid:ThemedDataGrid AutoGenerateColumns="False" ItemsSource="{Binding Model.ItemCollection, UpdateSourceTrigger=PropertyChanged}"  
                 SelectionUnit="FullRow" SelectedItem="{Binding Model.DatagridSelectedItem, UpdateSourceTrigger=PropertyChanged}">
</datagrid:ThemedDataGrid>

我有一个事件RowEditEnding,我在其中检查列中是否已存在具有先前输入的相同值的单元格。如果它存在,那么我需要取消编辑。我的RowEditEnding方法如下:

int counter = 0;
Model.ItemCollection.ForEach(x =>
{
    //if column is not empty
    if (!String.IsNullOrEmpty(x.Name))
    {
        if (x.Name== Model.DatagridSelectedItem.Name)
        {
            counter++;
            if (counter > 1)
            {
                MessageBox.Show("Doubled Name");
                e.Cancel = true;
                datagrid.CancelEdit(DataGridEditingUnit.Row);                                                            
            }
        }
    }
});

问题在于这一行:

  

datagrid.CancelEdit()

不会将单元格值更改为前一个,并且我得到无限循环。我该如何解决?

4 个答案:

答案 0 :(得分:3)

您的集合是否绑定到使用自定义对象填充的ItemsSource属性?如果是这样,我认为您的自定义数据类必须实现IEditableObject接口。 确实来自DataGrid documentation

  

为了保证可以正确提交和取消编辑,   DataGrid中的对象必须实现IEditableObject接口。

答案 1 :(得分:0)

试着忽略这一点:

datagrid.CancelEdit(DataGridEditingUnit.Row);   

在我看来,e.Cancel = true应该可以胜任。

答案 2 :(得分:0)

为您的类实现IEditableObject接口。它是一个ObservableCollection。(诊断是一个类,Name是属性)

% conda update nltk

答案 3 :(得分:0)

我有同样的问题。以我的个人经验,用datagrid.CancelEdit(DataGridEditingUnit.Row);代替datagrid.EndEdit();可以达到目的。

用法示例:

在下面的GIF中,我已将方法.EndEdit()应用于第二列(什么都没有应用于第一列)。如您所见,第一列允许编辑单元格(出现键入光标),而第二列则不允许。

EndEdit() Method Preventing Cel