在ListView中分配新的ItemsSource后继续选择

时间:2015-02-03 12:55:01

标签: wpf listview

在ListView中分配新的ItemsSource后保持选择?我将ListView.SelectedItems保存到临时变量(称为tmp),分配新的ItemsSource,然后迭代每个tmp元素并将其添加到SelectedItems,但它不能按预期工作。

var oldSelected = listView.SelectedItems;
listView.ItemsSource = Controller.Automats;
foreach(var item in oldSelected)
{
   listView.SelectedItems.Add(item)
}

不幸的是,刷新后的选择总是很清楚。

2 个答案:

答案 0 :(得分:1)

所选项目必须存在于集合中,因此保存上一个集合中的项目无助于您从新集合中选择不同的项目。要清楚,我正在谈论记忆中的实际项目。

如果您的商品具有某种可识别属性,您可以执行的操作是迭代已保存的所选商品,并使用ListView.SelectedItems将新收藏中的相关商品添加到LinQ集合中:

foreach(var item in oldSelected)
{
    listView.SelectedItems.Add(listView.Items.Single(i => i.Id == item.Id))
}

答案 1 :(得分:0)

嗯,这里至少有两个问题。 首先,您的oldSelected参考SelectedItems集合,而不是单独的集合。因此,当ItemSource更改时清除SelectedItems时,也会清除oldSelected。我们可以通过创建单独的列表来修复它:

var oldSelected = listView.SelectedItems.OfType<AutomatOrWhatever>().ToList();

接下来,即使我们有一个项目列表,新的ItemsSource也可能有一个不同实体的列表(属性可能相同,但实例本身不同)。要选择,对象必须存在于ItemsSource和SelectedItems集合中,并且您的oldSelected对象不再位于ItemsSource中,因此即使您将它们添加到选择中,也不会发生任何事情。我们需要一种方法来查找相同的项目,例如使用以下属性之一:

var selectedNames = oldSelected.Select(i => i.Name);
foreach (var s in listView.Items.OfType<AutomatOrWhatever>().Where(i => selectedNames.Contains(i.Name)))
{
    lbMain.SelectedItems.Add(s);
}

这只是一个原始的例子,但你可以得到这个想法。