【问题标题】:How to update ItemsSource without ObservableCollection如何在没有 ObservableCollection 的情况下更新 ItemsSource
【发布时间】:2013-12-19 21:28:37
【问题描述】:

运行以下代码不会从列表框中删除项目(在用户看来)

        lbxUserSecurityGroups.ItemsSource = _currentUserGroups;
        _currentUserGroups.RemoveAt(0);
        lbxUserSecurityGroups.ItemsSource = _currentUserGroups;

但这会:

        lbxUserSecurityGroups.ItemsSource = _currentUserGroups;
        _currentUserGroups.RemoveAt(0);
        lbxUserSecurityGroups.ItemsSource = null;
        lbxUserSecurityGroups.ItemsSource = _currentUserGroups;

我的猜测是,由于我对 ItemsSource 使用相同的对象,因此列表框不会更新,因为它认为没有理由更新(例如,仅在项目源发生更改时才更新它)

有没有办法强制 ItemsSource 更新,例如:

        lbxUserSecurityGroups.UpdateItemsSource();

注意:我知道执行此操作的正确方法是使用 ObservableCollection。但这让我觉得奇怪的行为,我希望能够通过在将值设置为正确值之前将值设置为 null 来完成我正在尝试的事情。

【问题讨论】:

  • WPF / silverlight DepedencyProperty 机制确保在更新 UI / 执行任何操作之前值已更改。您将 same exact reference 设置为 ItemsSource,无论该对象的内容是否已更改。

标签: c# silverlight itemssource


【解决方案1】:

您可以使用以下内容强制刷新。这可能会比您当前执行的方式产生更少的开销(必须取消订阅/重新订阅事件,并且可能必须创建一个新的 Binding 对象 - 尽管我不能 100% 确定幕后发生的事情) .

lbxUserSecurityGroups.GetBindingExpression(ItemsSourceProperty).UpdateTarget();

【讨论】:

    【解决方案2】:

    是的 - 它不会更新,因为 ItemsSource 仍然是对同一对象的引用。首先将其设置为null 即可(如您所见)。或者您可以使用ObservableCollection,或者您可以使用您自己的集合来实现相应的接口INotifyCollectionChanged

    绑定足够智能,不会在您尝试将属性设置为其已有的引用时更新。如果没有,您最终会得到大量冗余更新,并且您的所有属性都需要处理检查新值是否与当前值相同,这将是乏味的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      相关资源
      最近更新 更多