WPF Datagrid:除新行外,所有行中的一列都是只读的-如何?

WPF Datagrid:除新行外,所有行中的一列都是只读的-如何?,wpf,entity-framework,wpfdatagrid,Wpf,Entity Framework,Wpfdatagrid,我正在使用备份数据库中的一个特定表,该表使用相关的数据项作为主键(在本例中为用户的首字母)。这是我无法改变的;这是一个传统的设计,所以我坚持它。但是因为它是相关的,所以它必须显示在我使用的DataGrid中(通过ObjectContext绑定到数据库中的表) 不幸的是,这意味着当用户试图编辑现有记录上的首字母时,会引发异常,因为他们试图编辑与此表对应的实体的实体键 这一切都很好,因为他们不需要也不应该编辑那个专栏,所以在一般情况下,我只是把这个专栏标为只读。问题是,我确实需要他们能够在表中输入新

我正在使用备份数据库中的一个特定表,该表使用相关的数据项作为主键(在本例中为用户的首字母)。这是我无法改变的;这是一个传统的设计,所以我坚持它。但是因为它是相关的,所以它必须显示在我使用的DataGrid中(通过ObjectContext绑定到数据库中的表)

不幸的是,这意味着当用户试图编辑现有记录上的首字母时,会引发异常,因为他们试图编辑与此表对应的实体的实体键

这一切都很好,因为他们不需要也不应该编辑那个专栏,所以在一般情况下,我只是把这个专栏标为只读。问题是,我确实需要他们能够在表中输入新记录,但如果我将列标记为只读,他们就不能在“新行”中输入首字母缩写。要么

如何使此列中除“新行”中的单元格外的所有单元格均为只读


(或者我的整个方法根本上是错误的——记住我不能更改表,并且这个字段需要存在并由用户插入,尽管不可更新?)

如果不想编辑单元格,我认为您可以处理
DataGrid.BeginingEdit
事件并设置
e.Cancel=true
(请参见:)(您可以使用
e.Column
和e.
行属性来检查此问题)

Ron的上述回答解决了我一半的问题(非常感谢!),另一半是检测哪些单元格是“新行”的一部分首先,这个答案是通过一个小小的实验得出的——检查附加到该行的实体的EntityState会告诉你,因为当你在“新行”中时,它是“分离”的,当你离开它时,在更改实际保存到ObjectContext之前,它会被更改为“添加”(此时仍可以自由编辑实体键列,而不会导致错误)

因此,实现这一目标的代码如下:

private void userDataGrid_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
{
    if ((string)e.Column.Header == "Initials")
    {
        // If this is the new row, entity is not yet attached to the context.
        if (
            (((User)e.Row.Item).EntityState != EntityState.Detached) &&
            (((User)e.Row.Item).EntityState != EntityState.Added))
        {
            e.Cancel = true;
        }
    }
}

对塞伯拉特答案的一种变异

private void gridData_BeginningEdit(object sender, DataGridBeginningEditEventArgs e)
    {
        if ((string)e.Column.Header == "Doctor ID")
        {
            if (!e.Row.IsNewItem)
            {
                e.Cancel = true;
            }
        }
    }

为什么不将单元格设置为只读?我的意思是,不是整个列?IIRC DataGridCells上的IsReadOnly属性本身是只读的?我可以通过截取各种事件等方式找到一些方法,但我不确定该怎么做。