我有一个wpf组合框。它的ItemsSource已绑定到ObservebaleCollection。显示的值(通过DisplayMemberPath)是Entity类的Name属性。问题是,当我更新当前选定的实体名称并触发NotifyPropertyChnage时,它不会在UI中更新(即使当我打开组合列表时,它也会在那里更新)。我想问题是实体哈希码仍然相同,并且组合看不到差异。我能做什么?
xaml:
<ComboBox ItemsSource="{Binding Entities, Mode=OneWay}"
SelectedItem="{Binding CurrentEntity}"
DisplayMemberPath="Name"/>
Run Code Online (Sandbox Code Playgroud)
码:
public event PropertyChangedEventHandler PropertyChanged;
ObservableCollection<Entity> m_entities = new ObservableCollection<Entity>();
public ObservableCollection<Entity> Entities{get{return m_entities;}}
public Entity CurrentEntity{get;set}
public void RenameEntity(string name)
{
m_currentEntity.Name = name;
PropertyChanged(this, new PropertyChangedEventArgs("CurrentEntity"));
PropertyChanged(this, new PropertyChangedEventArgs("Entities"));
}
Run Code Online (Sandbox Code Playgroud)
显然,问题在于组合框在数据对象上调用ToString以显示所选项目,并在下拉菜单中使用DisplayMemberPath作为项目。
要解决此问题,请使用DataTemplate代替DisplayMemberPath:
<DataTemplate x:Key="EntityTemplate"
DataType="{x:Type my:Entity}">
<TextBlock Text="{Binding Name}"/>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
并将其分配给组合框的ItemTemplate属性:
<ComboBox ItemsSource="{Binding Entities}"
ItemTemplate="{StaticResource EntityTemplate}"
SelectedItem="{Binding ...}"/>
Run Code Online (Sandbox Code Playgroud)