WPF绑定不令人耳目一新

时间:2010-10-20 17:31:53

标签: wpf data-binding listbox

我的表单上有一个列表框,如下所示:

<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());
        }

列表中的项目仍以原始顺序显示。我可以确认该列表已重新排序,但这些项目仍按原始顺序显示。如何刷新此绑定?

4 个答案:

答案 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;