【问题标题】:WPF DataGrid cell bound to Property of Property in domain object not updatingWPF DataGrid 单元格绑定到域对象中属性的属性未更新
【发布时间】: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 专业列绑定源已更改并刷新?

感谢您的建议。

【问题讨论】:

    标签: wpf wpfdatagrid


    【解决方案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 中建模的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多