【问题标题】:Binding WPF ListView to Dictionary<string, int> only updates on the first change将 WPF ListView 绑定到 Dictionary<string, int> 仅在第一次更改时更新
【发布时间】:2015-08-24 14:51:06
【问题描述】:

我已将我的 ListView 绑定到字典,但它只是在我第一次向字典中添加内容时更新。任何后续更改都不会更新。

WPF:

<ListView Name="LogLevelListView" ItemsSource="{Binding MyDictionary, Mode=TwoWay}" >
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Name" Width="Auto" DisplayMemberBinding="{Binding Key}" />
            <GridViewColumn Header="Level" Width="Auto" DisplayMemberBinding="{Binding Value}" />
        </GridView>
    </ListView.View>
</ListView>

C#代码:

MyDictionary.Add(MyKey, MyValue);
OnPropertyChanged("MyDictionary");

知道为什么只有第一次更新有效吗?

【问题讨论】:

  • @CathaIMF 我的回答对您的问题有效吗?
  • @JuanM.Elosegui - 我还没有开始实施它。我做了 user3690202 建议的解决方法,目前有效。一旦我开始正确实施它,我会回来并将您的答案标记为正确。

标签: c# wpf dictionary binding


【解决方案1】:

您应该使用实现INotifyCollectionChanged 的集合,例如ObservableCollection

表示一个动态数据集合,它在何时提供通知 添加、删除或刷新整个列表时。

更新

如果您以这种方式使用绑定,您的集合将不会因为ItemsControl.ItemsSource 的实现方式而更新。

转到here 第 1687 行,您将看到如下内容:

if (_collectionView == view)
      return;

您的集合引用是相同的,因此它永远不会刷新。

这就是为什么它只在第一次更新时起作用。

【讨论】:

  • 也许可以,但绑定到这样的字典应该可以。
  • 我同意使用 ObservableCollection。我有点希望 WPF 有一个内置的 ObservableDictionary。 @CathalMF - 您可以通过将绑定设置为 null 来绕过 Juan 所说的限制,然后在您更改某些内容时将其设置回字典。
  • @user3690202 是的,将 ItemSource 重置为 null 并返回即可。但我想我应该实现一个可观察的集合。
  • @CathalMF - 是的,ObservableCollection 可能是您在 WPF MVVM 中唯一需要了解的集合 :)
【解决方案2】:

【讨论】:

  • ListCollectionView 在构造函数中没有字典
猜你喜欢
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 2021-10-22
相关资源
最近更新 更多