我的表单上有一个列表框,如下所示:
<ListBox Name="lbResults" SelectionChanged="lbResults_SelectionChanged"/>
我将以下集合绑定到它:
ObservableCollection<Hand> oHands = new ObservableCollection<Hand>();
使用以下代码:
lbResults.DataContext = oHands;
Binding binding = new Binding();
lbResults.SetBinding(ListBox.ItemsSourceProperty, binding);
oHands集合通过后台工作程序填充,后者通过事件在新的Hand对象可用时通知事件。添加内容时,ListBox会完美刷新。显示Hand对象的ToString()结果,这就是我想要的 - 到目前为止一切顺利。但是,当后台工作人员完成时
void finder_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
oHands = new ObservableCollection<Hand>(oHands.OrderBy(o => o.PotSize));
lbResults.SetBinding(ListBox.ItemsSourceProperty, new Binding());
}
列表中的项目仍以原始顺序显示。我可以确认该列表已重新排序,但这些项目仍按原始顺序显示。如何刷新此绑定?
答案 0 :(得分:1)
而不是替换整个可观察集合,您可以清除它并添加所有新项目。这不会影响你的装订。
您还可以使用CollectionViewSource
作为绑定,并在其上设置顺序,而不是重新排序整个集合。
答案 1 :(得分:1)
你不想为oHands分配一个新的集合。只需清除()集合然后添加操作的结果。不要更新绑定
答案 2 :(得分:0)
你真的只是应该从INotifyPropertyChanged接口继承,但是另一种方法是强制更新绑定:
BindingExpression exp = BindingOperations.GetBindingExpression(lbResults, Listbox.ItemsSourceProperty)
exp.UpdateTarget()
编辑:我也注意到你没有在XAML中设置任何绑定,并且看起来是以编程方式使用空Binding进行的。我之前没有尝试过这种方式,所以看看将XAML更改为可能会有所帮助:
<ListBox Name="lbResults" SelectionChanged="lbResults_SelectionChanged" ItemsSource="{Binding Path=oHands}"/>
然后将lbResults.DataContext
设置为指向具有成员oHands
的类。这在我的项目中对我有用(在IronPython中,如果我的示例没有完美地转换为C#,请原谅我。)
答案 3 :(得分:0)
直接设置itemsource会不会更容易?
lbResults.ItemsSource = oHands;