2013-12-17 142 views
0

我正在開發一個WPF應用程序並使用mvvm light工具包。我的viewmodel包含一個更新ObservableCollection的計時器。另外我有一個ListCollectionView。更新後保留Datagrid多重選擇

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的改變,以及,所以是數據網格的內容。 我可以在更改之間選擇多行,但只要數據網格內容更改,我的選擇就會丟失。

即使內容已更改,如何保留所有數據網格選擇?

回答

0

爲什麼不在更新之前考慮所選項目?更新後,根據需要重新填充所選的SelectedItems列表。

從MVVM的角度來看,這是一個挑戰,因爲SelectedItems不是依賴項屬性。但是,使用您的view-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; 
}