我正在开发一个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内容发生更改,我的选择就会丢失。
如果我的所有数据网格选择都保留,即使其内容已更改,我该如何保留?
答案 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;
}