2010-10-20 102 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