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 模板列修改某个单元格,更新所选行另一个单元格的值,如何做到呢?

wpf datagrid 单元格如何默认单击一次点中

基于行项目值的wpf datagrid单元格样式

WPF DataGrid 将单元格绑定到具有动态列的数据模型

突出显示 WPF DataGrid 的已编辑单元格

WPF DataGrid动态生成列的单元格背景色绑定