重新加载ItemsSource时如何在ListBox中保留选择

时间:2011-09-26 06:09:06

标签: c# wpf mvvm

我正在我们的系统中试验WPF和MVVM。但是,我只使用MVVM(不使用额外的CollectionViews)在列表中选择保留选项时遇到问题。 我目前拥有的是清单

ObservableCollection<ReservationCustomerList> Customers;

然后是存储所选客户的财产

ReservationCustomerList SelectedCustomer;

在我看来,当列表重新加载(实际上是从另一个线程异步)时,应该能够保留选择,但这不会发生。

有人有一个很好的清洁方法来实现这个目标吗?

4 个答案:

答案 0 :(得分:3)

我们这样做的方式是我们没有取代该系列。如果需要,我们添加/删除了条目并更新了现有条目。这样可以保持选择。

您可以使用Except之类的LINQ方法识别新的或删除的项目。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您可以使用ICollectionView选择所需的实体。

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

view.MoveCurrentTo(SelectedCustomer);

在您的Xaml中,itemsControl必须具有IsSynchronizedWithCurrentItem = true

或者如果ItemsControl具有SelectedItem属性,则只需将其绑定到SelectedCustomer属性即可。

答案 3 :(得分:0)

当您“重新加载”您的收藏时,您基本上会用新值替换其中的所有值。即使那些外观和感觉相同的东西实际上也是新物品。那么当你的项目消失时,你想如何引用列表中的相同项目?您当然可以使用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()'都没有用 - 正如我所料。