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

时间:2013-04-27 22:23:35

标签: wpf wpfdatagrid

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

我在获取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中的列是SubObject选项的ComboBox。它旁边的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 个答案:

答案 0 :(得分:1)

  

无论如何都要告诉DataGrid那个Specialty列绑定   来源已经改变并刷新?

是的,这是您的INotifyPropertyChanged实施发挥作用的地方。您应该将OnPropertyChanged事件作为该实现的一部分,使用属性名称调用此事件会告诉WPF属性值已更改并更新UI。当OnPropertyChanged更改时,您应该为Speciality媒体资源SubObject致电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(); } } } 。因为它们位于不同的类中,所以您可能需要公开方法或事件来执行此操作:

{{1}}

侧面,我不确定您的SubObjectId属性在这里使用了什么。您是否可以直接从SubObjectObj使用Id属性?