WPF Datagrid:除新行外,所有行中的一列都是只读的-如何?
我正在使用备份数据库中的一个特定表,该表使用相关的数据项作为主键(在本例中为用户的首字母)。这是我无法改变的;这是一个传统的设计,所以我坚持它。但是因为它是相关的,所以它必须显示在我使用的DataGrid中(通过ObjectContext绑定到数据库中的表) 不幸的是,这意味着当用户试图编辑现有记录上的首字母时,会引发异常,因为他们试图编辑与此表对应的实体的实体键 这一切都很好,因为他们不需要也不应该编辑那个专栏,所以在一般情况下,我只是把这个专栏标为只读。问题是,我确实需要他们能够在表中输入新记录,但如果我将列标记为只读,他们就不能在“新行”中输入首字母缩写。要么 如何使此列中除“新行”中的单元格外的所有单元格均为只读WPF Datagrid:除新行外,所有行中的一列都是只读的-如何?,wpf,entity-framework,wpfdatagrid,Wpf,Entity Framework,Wpfdatagrid,我正在使用备份数据库中的一个特定表,该表使用相关的数据项作为主键(在本例中为用户的首字母)。这是我无法改变的;这是一个传统的设计,所以我坚持它。但是因为它是相关的,所以它必须显示在我使用的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属性本身是只读的?我可以通过截取各种事件等方式找到一些方法,但我不确定该怎么做。