C# MVVM多选,数据重新加载后保留

C# MVVM多选,数据重新加载后保留,c#,wpf,listview,mvvm,C#,Wpf,Listview,Mvvm,我使用的是listview,它必须能够处理多重选择。为了实现这一点,我使用了(Ankesh答案)中描述的解决方案。它很好用。在我的应用程序中,某个计时器正在工作,它每10秒检索一次设备状态,并将ObservableCollection作为ItemsSource分配给我的ListView,然后取消选择我所选的行 我认为,在将数据重新加载到临时变量之前存储选定项并在以后分配它时,它会起作用,但我有一些无法诊断的问题 这是我的代码(重新加载数据块): 不幸的是,这样的代码会在重新加载数据后清除所选内容

我使用的是listview,它必须能够处理多重选择。为了实现这一点,我使用了(Ankesh答案)中描述的解决方案。它很好用。在我的应用程序中,某个计时器正在工作,它每10秒检索一次设备状态,并将ObservableCollection作为ItemsSource分配给我的ListView,然后取消选择我所选的行

我认为,在将数据重新加载到临时变量之前存储选定项并在以后分配它时,它会起作用,但我有一些无法诊断的问题

这是我的代码(重新加载数据块):


不幸的是,这样的代码会在重新加载数据后清除所选内容。

1)从链接问题(尤其是视图模型中的
IsSelected
标志)中接受答案是正确的选择;我不建议使用第二个答案中的行为;2) 添加到
oldSelected
时,克隆对象的目的是什么?3)
Machines
FullMachines
的关系如何?广告1。我想在我的模型中避免使用IsSelected标志。公元2年。我之所以克隆它,是因为我不想存储对以后可以删除的元素的引用。公元3年。这是错误的,它是相同的元素,我更正了我的代码。
if (SelectedMachines != null)
{
    foreach (var selectedMachine in SelectedMachines)
    {
        oldSelected.Add(selectedMachine.Clone()); // clone objects
    }
 SelectedMachines.Clear();
 }

Machines = Controller.GetAutomats(); // assign data

if (SelectedMachines != null) // restore selection
{
    foreach (var selectedMachine in oldSelected)
    {
        SelectedMachines.Add(Machines.Where(t => t.Id == selectedMachine.Id).FirstOrDefault());
        // at this point SelectedMachines has same elements count as before assign
    }
}