我如何保持选择在列表框时,重新加载ItemsSource

本文关键字:新加载 加载 ItemsSource 何保持 选择 列表 | 更新日期: 2023-09-27 18:09:33

我正在我们的系统中试验WPF和MVVM。然而,我有一个问题,保持只使用MVVM列表中选择的东西(不做额外的CollectionViews)。我现在拥有的是列表

ObservableCollection<ReservationCustomerList> Customers;

然后是存储所选Customer

的属性
ReservationCustomerList SelectedCustomer;

在我看来,现在,当列表重新加载(实际上从另一个线程异步),选择应该能够被保留,然而这并没有发生。

有没有人有一个好的干净的方法来实现这个?

我如何保持选择在列表框时,重新加载ItemsSource

我们的做法是不替换集合。我们添加/删除了条目,并根据需要更新了现有条目。这维持了选择。

您可以使用像Except这样的LINQ方法来识别新的或删除的项。

如果重新加载的列表仍然包含最后选择的项目,并且您希望该项目被选中,那么您可以在重新加载集合后为属性SelectedCustomer引发PropertyChange事件。请确保你的viewmodel类实现了INotifyPropertyChanged接口

你可以使用ICollectionView来选择你想要的实体。

ICollectionview view = (ICollectionView)CollectionViewSource.GetDefaultView(this.Customers);
view.MoveCurrentTo(SelectedCustomer);

在你的Xaml中itemsControl必须有IsSynchronizedWithCurrentItem=true

或者如果ItemsControl有一个SelectedItem属性,你可以简单地将它绑定到你的SelectedCustomer属性。

当你"重新加载"你的集合时,你基本上用新值替换它中的所有值。即使那些看起来和感觉一样的东西实际上也是新的。那么,当列表中的相同项消失时,您希望如何引用它呢?你当然可以使用一个hack,你可以通过它的属性来确定被选中的项目并重新选择它(即通过列表进行LINQ搜索并返回匹配项目的ID,然后重新选择它)。但这肯定不是最佳实践。

您实际上应该只更新您的集合,即删除无效条目并添加新条目。如果你有一个视图连接到你的集合,所有的排序和选择等将自动在后台完成。

编辑:

        var tmp = this.listBox1.SelectedValue;
        this._customers.Clear();
        this._customers.Add(item1); this._customers.Add(item2);
        this._customers.Add(item3); this._customers.Add(item4);
        this.listBox1.SelectedValue = tmp;

中的重置/清除方法为我工作。也就是说,这是我在按下刷新按钮时在我的示例应用程序中调用的事件处理方法的代码。这样你甚至不需要保持对客户对象的引用,只要你确保无论你的ID是一致的。我尝试过的其他事情,如覆盖集合' ClearItems() '方法和覆盖' Equals() '和' GetHashCode() '没有工作-正如我所料。