WPF绑定不刷新

WPF绑定不刷新,wpf,data-binding,listbox,Wpf,Data Binding,Listbox,我的表单上有一个列表框,如下所示: <ListBox Name="lbResults" SelectionChanged="lbResults_SelectionChanged"/> oHands集合通过后台工作程序填充,每当有新的手对象可用时,后台工作程序就会通过事件宣布。添加内容后,列表框将完全刷新。将显示Hand对象的ToString()结果,这正是我想要的-到目前为止还不错。但是,当后台工作程序完成时 void finder_RunWorkerCompleted(objec

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

<ListBox Name="lbResults" SelectionChanged="lbResults_SelectionChanged"/>
oHands集合通过后台工作程序填充,每当有新的手对象可用时,后台工作程序就会通过事件宣布。添加内容后,列表框将完全刷新。将显示Hand对象的ToString()结果,这正是我想要的-到目前为止还不错。但是,当后台工作程序完成时

void finder_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            oHands = new ObservableCollection<Hand>(oHands.OrderBy(o => o.PotSize));
            lbResults.SetBinding(ListBox.ItemsSourceProperty, new Binding());
        }
void finder\u RunWorkerCompleted(对象发送方,runworkercompletedeventarge)
{
oHands=新的可观测集合(oHands.OrderBy(o=>o.PotSize));
lbResults.SetBinding(ListBox.ItemsSourceProperty,new Binding());
}
列表中的项目仍按原始顺序显示。我可以确认列表已重新排序,但项目仍按原始顺序显示。如何刷新此绑定?

您实际上应该从INotifyPropertyChanged接口继承,但以下是强制更新绑定的另一种方法:

BindingExpression exp = BindingOperations.GetBindingExpression(lbResults, Listbox.ItemsSourceProperty)
exp.UpdateTarget()
编辑:我还注意到您没有在XAML中设置任何绑定,并且似乎是用空绑定以编程方式进行的。我以前从未尝试过这种方法,因此请查看将XAML更改为此是否有帮助:

<ListBox Name="lbResults" SelectionChanged="lbResults_SelectionChanged" ItemsSource="{Binding Path=oHands}"/>


然后将
lbResults.DataContext
设置为指向具有成员
oHands
的类。这就是在我的项目中对我有用的东西(在IronPython中,如果我的示例没有完全转换为C,请原谅)。

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


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

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

直接设置itemsource不是更容易吗

lbResults.ItemsSource = oHands;

我将worker completed方法更新为:void finder_RunWorkerCompleted(对象发送方,RunWorkerCompletedEventArgs e){oHands=newobserveCollection(oHands.OrderBy(o=>o.PotSize));BindingExpression=BindingOperations.GetBindingExpression(lbResults,ListBox.ItemsSourceProperty);exp.UpdateTarget();}但它仍然没有出现在新的订单中:(当oHands被更改或重新排序时,它会更新吗?因为它是一个可观察的集合,对集合的更改会更改列表框。如果您对它进行排序并返回一个新集合,itemsource将使用新集合更新。好的,这起到了作用,但我想Alex刚才回答了相同的建议。谢谢:)没关系,他现在比我更需要代表:)
<ListBox Name="lbResults" SelectionChanged="lbResults_SelectionChanged" ItemsSource="{Binding Path=oHands}"/>
lbResults.ItemsSource = oHands;