在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)
}
不幸的是,刷新后的选择总是很清楚。
答案 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);
}
这只是一个原始的例子,但你可以得到这个想法。