2

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

我在获取要更新绑定到属性的属性的 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 Specialty 列绑定源已更改并刷新?

感谢您的任何建议。

4

1 回答 1

1

无论如何要告诉 DataGrid Specialty 列绑定源已更改并刷新?

是的,这就是您的INotifyPropertyChanged实施发挥作用的地方。您应该有一个 OnPropertyChanged 事件作为该实现的一部分,使用属性名称调用此事件会告诉 WPF 属性值已更改并更新 UI。当您更改时,您应该调用OnPropertyChangedSpeciality属性。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();
        } 
    }
}

顺便说一句,我不确定您的 SubObjectId 属性在这里有什么用途。您是否可以直接从 SubObjectObj 使用 Id 属性?

于 2013-04-28T01:11:49.397 回答