如何在没有ObservableCollection的情况下更新ItemsSource

时间:2013-12-19 21:28:38

标签: c# silverlight itemssource

运行以下代码不会从列表框中删除该项目(因为它对用户显示)

        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来做我正在尝试的事情而不会乱解。

2 个答案:

答案 0 :(得分:2)

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

lbxUserSecurityGroups.GetBindingExpression(ItemsSourceProperty).UpdateTarget();

答案 1 :(得分:1)

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

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

相关问题