WPF DataGrid 单元格绑定到域对象中属性的属性未更新
Posted
技术标签:
【中文标题】WPF DataGrid 单元格绑定到域对象中属性的属性未更新【英文标题】:WPF DataGrid cell bound to Property of Property in domain object not updating 【发布时间】:2013-04-21 20:53:01 【问题描述】:我尝试从几个角度解决这个问题。这里我试着把它简化成一个小测试用例。
我在更新绑定到属性的属性的 DataGrid 单元格时遇到问题。该属性由另一列中的绑定 ComboBox 单元格设置。绑定对象如下,我指的是属性:
public class MainObject : INotifyPropertyChanged
private int _subObjectId;
public virtual SubObject SubObjectObj get; set;
public int SubObjectId
get return _subObjectId;
set _subObjectId = value; SubObjectObj = <GetObjFromDB> ;
...
public class SubObject : INotifyPropertyChanged
public int Id get; set;
public string Name get; set;
public string Specialty get; set;
...
DataGrid ItemsSource 是
public ObservableCollection<MainObject> SourceData;
现在,DataGrid 中的列是子对象选项的组合框。它旁边的 TextBox 列(假定)显示在 ComboBox 中选择的任何 SubObject 的 SubObject.Specialty。
<DataGridTemplateColumn Header="SubObjects">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="Binding SubObject.Name, UpdateSourceTrigger=PropertyChanged"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox x:Name="ComboBoxSubObject" ItemsSource="Binding Model.SubObjects, RelativeSource=RelativeSource AncestorType=x:Type uch:TestControl"
DisplayMemberPath="Name"
SelectedValuePath="Id"
SelectedValue="Binding SubObjectId, UpdateSourceTrigger=PropertyChanged"
SelectionChanged="ComboBoxDoctor_OnSelectionChanged"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Specialty" Binding="Binding Path=SubObjectObj.Specialty"/>
最初绘制网格时,Specialty 列是正确的 - 它的属性是 SubObject 在另一列中显示的内容。但是当我更改 ComboBox 时,Specialty 列并没有改变。无论如何告诉 DataGrid 专业列绑定源已更改并刷新?
感谢您的建议。
【问题讨论】:
【参考方案1】:无论如何要告诉 DataGrid 特殊列绑定 源已更改并刷新?
是的,这就是您的INotifyPropertyChanged
实现发挥作用的地方。您应该有一个 OnPropertyChanged 事件作为该实现的一部分,使用属性名称调用此事件会告诉 WPF 属性值已更改并更新 UI。当您的SubObject
更改时,您应该为Speciality
属性调用OnPropertyChanged
。因为它们在不同的类中,所以您可能需要公开一个方法或一个事件来执行此操作:
public class SubObject : INotifyPropertyChanged
public int Id get; set;
public string Name get; set;
public string Specialty get; set;
public void OnSpecialityChanged()
OnPropertyChanged("Speciality");
public class MainObject : INotifyPropertyChanged
private int _subObjectId;
public virtual SubObject SubObjectObj get; set;
public int SubObjectId
get return _subObjectId;
set
_subObjectId = value;
SubObjectObj = <GetObjFromDB>
SubObjectObj.OnSpecialityChanged();
另外一点,我不确定您的 SubObjectId 属性在此处的用途。您是否可以直接使用 SubObjectObj 中的 Id 属性?
【讨论】:
是的 - 这就是我所缺少的是专业上的明确 OnPropertyChanges。谢谢! SubObjectId 的原因是它是外键在实体框架代码优先 POCO 中建模的方式。以上是关于WPF DataGrid 单元格绑定到域对象中属性的属性未更新的主要内容,如果未能解决你的问题,请参考以下文章
c# wpf datagrid 模板列修改某个单元格,更新所选行另一个单元格的值,如何做到呢?