【问题标题】:List.Clear() not working with Two way binding C#List.Clear() 不适用于两种方式绑定 C#
【发布时间】:2015-05-08 08:18:34
【问题描述】:

我在 WPF MVVM 应用程序中工作,在该应用程序中,我需要清除一个列表,该列表作为两种方式绑定到 radGrid (即)必须在单击时显示网格为空一个按钮。

我尝试使用,

SeriesSearchList.Clear(); //不起作用。

SeriesSearchList = null; // 有效。

我已经这样声明了,

private List<SeriesSearchBO> m_lSearchList;

 public List<string> SeriesSearchList
   {
      get { return this.m_lSearchList; }
      set
          {
            if (this.m_lSearchList!= value)
              {
                 this.m_lSearchList= value;
                 OnPropertyChanged();
              }
          }
   }

只是好奇为什么我不能让List.Clear() 使用双向绑定。

【问题讨论】:

  • 使用 ObservableCollection 代替 List
  • "SeriesSearchList = null" 分配新值,调用 OnPropertyChanged "SeriesSearchList.Clear()" 旧列表引用,不调用 OnPropertyChanged 您应该使用 ObservableCollection 或在清除调用方法 OnPropertyChanged("SeriesSearchList ")
  • @General-Doomer :像魅力一样工作。非常感谢。
  • 相关herehere,这个问题已经被问过几次次了。

标签: c# wpf mvvm


【解决方案1】:

在第一种情况下,您从列表中删除所有元素,但不分配新值(旧引用) 在第二种情况下,您将新值分配给列表,以便调用方法 OnPropertyChanged。

你可以通过两种方式解决这个问题:

  1. 使用 ObservableCollection 而不是 List,就像 @General-Doomer 所说的那样
  2. SeriesSearchList.Clear(); OnPropertyChanged("SeriesSearchList");

【讨论】:

  • 第一种方法做得很好。但第二个我无法实现。有什么想法吗?
【解决方案2】:

正如 General-Doomer 指出的那样,您需要使用 ObservableCollection 而不是标准列表

这样做的原因是因为 ObservableCollection 每次底层列表的内容发生变化时都会发布一个事件。 WPF 框架对此进行了挂钩,并会在 UI 发布时自动更新。

现在 Clear 不起作用但将其设置为 Null DOES 的原因是,当您清除它时,您正在更改属性的 CONTENT,而将其设置为 null 会更改 ACTUAL 属性。 UI 绑定到 SeriesList 属性,当它被更改(设置为 null)时,UI 将更新以反映它。

简而言之,如果您希望所有更改(在集合中。不在集合中的对象上)自动获取视图的更新,请使用 ObservableCollection。

【讨论】:

  • 你说的“每次底层列表的内容发生变化时ObservableCollection都会发布一个事件”你错了。 ObservableCollection 仅在列表本身的引用发生更改时才发布更改事件。不通知内容更改。如果你想要这种行为,你可以使用System.ComponentModel.BindingList&lt;T&gt;。如果您想知道区别,请参阅stackoverflow.com/a/4284805/4668080。 @BjarkeSøgaard
  • 当我说集合的内容发生变化时,我并不是指集合中项目的属性。我的意思是集合的实际数量。我认为这很清楚。
猜你喜欢
  • 2015-05-29
  • 1970-01-01
  • 1970-01-01
  • 2019-02-05
  • 2015-10-27
  • 2014-10-07
  • 1970-01-01
  • 2018-07-25
  • 2016-10-19
相关资源
最近更新 更多