运行以下代码不会从列表框中删除该项目(因为它对用户显示)
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来做我正在尝试的事情而不会乱解。
答案 0 :(得分:2)
您可以使用以下内容强制刷新。这可能比你当前的方式产生更少的开销(事件必须取消订阅/重新订阅,并且可能必须创建新的Binding对象 - 尽管我不是100%确定幕后发生的事情)
lbxUserSecurityGroups.GetBindingExpression(ItemsSourceProperty).UpdateTarget();
答案 1 :(得分:1)
是 - 它不会更新,因为ItemsSource
仍然是对同一对象的引用。首先将其设置为null
即可(如您所见)。或者您可以使用ObservableCollection
,也可以使用自己的集合来实现适当的接口INotifyCollectionChanged
。
当您尝试将属性设置为与其已有的相同引用时,绑定非常智能,不会更新。如果没有,你最终会得到大量的冗余更新,并且所有属性都需要处理检查新值是否与当前繁琐的相同。