2010-10-20 74 views
0

我有我的窗体上的列表框,看起来像这样:WPF绑定不刷新

<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对象是ava时通过事件通知ilable。当添加东西时,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()); 
     } 

列表中的项目仍以原始顺序显示。我可以确认这个清单是重新排列的,但是这些项目仍然以原始顺序显示。我如何刷新这个绑定?

回答

1

你不想分配oHands一个新的集合。只需清除()集合,然后添加操作的结果。不要更新绑定

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#,请原谅我)。

+0

我更新我的工人完成方法看起来像: 空隙finder_RunWorkerCompleted(对象发件人,RunWorkerCompletedEventArgs E) \t \t { \t \t \t oHands =新的ObservableCollection (oHands.OrderBy(O => 0。 PotSize)); \t \t \t BindingExpression exp = BindingOperations.GetBindingExpression(lbResults,ListBox.ItemsSourceProperty); \t \t \t exp。UpdateTarget(); \t \t} 但它仍然没有在新命令:( – 2010-10-20 17:44:35

+0

我在另一种方法编辑你可以把显示出来。 – Aphex 2010-10-20 18:11:00

1

而不是替换整个可观察集合,您可以清除它并添加所有新项目。这不会影响你的约束力。

您也可以使用CollectionViewSource作为绑定,并设置顺序而不是重新排序整个集合。

+0

确定这个工作,但我认为亚历克斯回答了一下前面相同的意见。谢谢:) – 2010-10-20 18:38:11

+0

其确定,他需要代表比我更多:) – 2010-10-20 21:03:16

0

直接设置itemsource不是很容易吗?

lbResults.ItemsSource = oHands; 
+0

当oHands被更改或重新排序时,实际上会更新吗? – Aphex 2010-10-20 18:11:46

+1

由于它是一个可观察的集合,对集合的更改将改变列表框。如果对它进行排序并返回一个新的集合,则itemsource将用新集合进行更新。 – mdm20 2010-10-20 18:20:03