WPF DataGrid单元格绑定到域对象中属性的属性,未更新
我试着从几个角度来研究这个问题。在这里,我试图将其简化为一个小测试用例 我在更新绑定到属性的属性的DataGrid单元格时遇到问题。属性由另一列中的绑定组合框单元格设置。绑定对象是如下所示的,具有我所指的属性:WPF DataGrid单元格绑定到域对象中属性的属性,未更新,wpf,wpfdatagrid,Wpf,Wpfdatagrid,我试着从几个角度来研究这个问题。在这里,我试图将其简化为一个小测试用例 我在更新绑定到属性的属性的DataGrid单元格时遇到问题。属性由另一列中的绑定组合框单元格设置。绑定对象是如下所示的,具有我所指的属性: public class MainObject : INotifyPropertyChanged { private int _subObjectId; public virtual SubObject SubObjectObj { get; set; } public in
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; }
...
}
public类主对象:INotifyPropertyChanged
{
私有int_子对象;
公共虚拟子对象子对象{get;set;}
公共int子对象{
获取{return\u subObjectId;}
设置{u subObjectId=value;SubObjectObj=};
}
...
}
公共类子对象:INotifyPropertyChanged
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共字符串专用项{get;set;}
...
}
DataGrid ItemsSource是
public ObservableCollection<MainObject> SourceData;
公共可观测采集源数据;
现在,DataGrid中的列是子对象选择的组合框。旁边的文本框列(假定)显示子对象。在组合框中选择的任何子对象的特性
<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}"/>
当网格最初绘制时,“专业”列是正确的-它的属性是其他列中显示的子对象。但是当我更改组合框时,Speciality列不会更改。是否有必要告诉DataGrid专业列绑定源已更改并刷新
谢谢你的建议
是否有任何方法可以告诉DataGrid专业列绑定
源已更改,是否要刷新
是的,这就是您的INotifyPropertyChanged
实现发挥作用的地方。作为该实现的一部分,您应该有一个OnPropertyChanged事件,使用属性名称调用该事件会告诉WPF属性值已更改,并更新UI。当子对象
更改时,应调用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();
}
}
}
公共类子对象:INotifyPropertyChanged
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共字符串专用项{get;set;}
特殊更改()上的公共无效
{
物业变更(“专业”);
}
}
公共类主对象:INotifyPropertyChanged
{
私有int_子对象;
公共虚拟子对象子对象{get;set;}
公共int子对象
{
获取{return\u subObjectId;}
设置
{
_subObjectId=值;
子对象bj=
SubObjectObj.OnSpecialityChanged();
}
}
}
顺便说一句,我不确定SubObject属性在这里的用途。您是否可以直接从SubObjectObj使用Id属性?是的-我缺少的是专业上的显式OnPropertyChanges。谢谢子对象的原因是,它是如何在实体框架代码中首先对外键进行建模的POCO。