【问题标题】:Update shown field in combobox DisplayMemberPath not shown更新组合框中显示的字段 DisplayMemberPath 未显示
【发布时间】:2011-02-01 08:56:57
【问题描述】:

我有一个 wpf 组合框。它的 ItemsSource 绑定到 ObservebaleCollection。显示的值(通过 DisplayMemberPath)是 Entity 类的 Name 属性。 问题是当我更新当前选定的实体名称并触发 NotifyPropertyChnage 时,它​​不会在 UI 中更新(即使当我打开组合列表时它也会在那里更新)。 我想问题是实体哈希码仍然相同,并且组合没有看到差异。我该怎么办?

xaml:

<ComboBox     ItemsSource="{Binding Entities, Mode=OneWay}" 
          SelectedItem="{Binding CurrentEntity}"
          DisplayMemberPath="Name"/>

代码:

    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"));
    }

【问题讨论】:

  • 首先你可以发布一些代码:)
  • 我也遇到了同样的问题。在项目名称(由 DisplayMemberPath 指向)更改后,我通过在后面的代码中清除和重新分配 DisplayMemberPath 来强制它刷新。我知道这是一个愚蠢的解决方案,但它是我认为最简单的解决方案。

标签: .net wpf combobox


【解决方案1】:

显然,问题在于组合框在数据对象上调用 ToString 以显示所选项目,并为下拉列表中的项目使用 DisplayMemberPath。

要解决此问题,请使用 DataTemplate 而不是 DisplayMemberPath:

<DataTemplate x:Key="EntityTemplate"
              DataType="{x:Type my:Entity}">
    <TextBlock Text="{Binding Name}"/>
</DataTemplate>

并将其分配给组合框的 ItemTemplate 属性:

<ComboBox ItemsSource="{Binding Entities}"
          ItemTemplate="{StaticResource EntityTemplate}"
          SelectedItem="{Binding ...}"/>

【讨论】:

  • 得到了同样的效果,列表已更新,但实体中更新的当前选定项仍显示为以前的样子
  • 您是否为实体内的 Name 属性触发 PropertyChanged 事件?
  • 尝试为 Entity.Name 提高 NotifyPropertyChange 但也没有帮助
  • 再次检查,当我将 INtifyPropertyChange 添加为实体的接口时工作。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多