WPF DataGrid单元格绑定到域对象中属性的属性,未更新

WPF DataGrid单元格绑定到域对象中属性的属性,未更新,wpf,wpfdatagrid,Wpf,Wpfdatagrid,我试着从几个角度来研究这个问题。在这里,我试图将其简化为一个小测试用例 我在更新绑定到属性的属性的DataGrid单元格时遇到问题。属性由另一列中的绑定组合框单元格设置。绑定对象是如下所示的,具有我所指的属性: public class MainObject : INotifyPropertyChanged { private int _subObjectId; public virtual SubObject SubObjectObj { get; set; } public in

我试着从几个角度来研究这个问题。在这里,我试图将其简化为一个小测试用例

我在更新绑定到属性的属性的DataGrid单元格时遇到问题。属性由另一列中的绑定组合框单元格设置。绑定对象是如下所示的,具有我所指的属性:

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。