我试图从几个角度来解决这个问题。在这里,我试图将其简化为一个小测试用例。
我在获取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专业列绑定源是否已更改并刷新?
感谢您的任何建议。
答案 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属性?