更新后保留Datagrid多选

时间:2013-12-17 19:31:01

标签: c# wpf mvvm datagrid selection

我正在开发一个WPF应用程序并使用mvvm light工具包。我的viewmodel由一个更新ObservableCollection的计时器组成。另外我有一个ListCollectionView。

ObservableCollection<MyType> obs = new ObservableCollection<MyType>();
ListCollectionView cView = new ListCollectionView(obs);

public void timer_elapsed(object sender, ElapsedEventArgs e)
{
    if(myOperation == add)
        obs.InsertItem(0, newObject);

    else if(myOperation == remove)
        obs[...].Close();

    else if(myOperation == modify)
        obs[...] = newObject;
}

在我看来,我将datagrid绑定到ListCollectionView:

<DataGrid 
    ItemsSource="{Binding cView}" 
    AutoGenerateColumns="True" 
    SelectionUnit="FullRow"
    SelectionMode="Extended"
    / >

只要定时器中的某个操作更改了ObservableCollection,ListCollectionView也会更改,datagrid的内容也会更改。 我可以在更改之间选择多行,但是一旦datagrids内容发生更改,我的选择就会丢失。

如果我的所有数据网格选择都保留,即使其内容已更改,我该如何保留?

1 个答案:

答案 0 :(得分:0)

为什么不在更新前记录所选项目?更新后,根据需要重新填充选定的SelectedItems列表。

从MVVM的角度来看,这是一个挑战,因为SelectedItems不是依赖属性。但是使用您选择的view-viewmodel通信方法 - 将视图项传递给viewmodel,事件聚合器,无论哪个。

完整性示例:

查看模型

public Func<IList> GetSelectedItems { get; set; }

public void timer_elapsed(object sender, ElapsedEventArgs e)
{
    var previouslySelectedItems = new List<MyType>(GetSelectedItems().OfType<MyType>());

    // .... updates

    var currentSelectedItems = GetSelectedItems();
    foreach (var selected in previouslySelectedItems) 
        if (!currentSelectedItems.Contains(selected))
            currentSelectedItems.Add(selected);
}

查看

public MyView()
{
    InitializeComonent
    Loaded += (sender, args) => 
        ((MyViewModel)DataContext).GetSelectedItems = () => grid.SelectedItems;
}