【问题标题】:WPF bindings not refreshingWPF 绑定不刷新
【发布时间】:2010-10-20 17:31:53
【问题描述】:

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

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

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

【问题讨论】:

    标签: wpf data-binding listbox


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 好吧,这行得通,但我认为亚历克斯早些时候回答了同样的建议。谢谢你:)
      • 没关系,他现在比我更需要代表 :)
      【解决方案3】:

      直接设置itemsource会不会容易很多?

      lbResults.ItemsSource = oHands;
      

      【讨论】:

      • 当 oHands 更改或重新排序时,它会真正更新吗?
      • 因为它是一个可观察的集合,所以对集合的更改会改变列表框。如果您对其进行排序并返回一个新集合,则 itemsource 将使用新集合进行更新。
      【解决方案4】:

      真的只是应该从 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#,请原谅我)。

      【讨论】:

      • 我更新了我的工人完成方法,如下所示: void finder_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { oHands = new ObservableCollection(oHands.OrderBy(o => o.PotSize)); BindingExpression exp = BindingOperations.GetBindingExpression(lbResults, ListBox.ItemsSourceProperty); exp.UpdateTarget(); } 但它仍然没有以新的顺序出现:(
      猜你喜欢
      • 1970-01-01
      • 2011-06-27
      • 2021-10-20
      • 1970-01-01
      • 2019-05-05
      • 2016-06-04
      • 2010-12-09
      • 2011-08-06
      • 1970-01-01
      相关资源
      最近更新 更多