DataGrid - 在到达新数据时重置网格选择

时间:2011-11-22 19:17:26

标签: c# wpf mvvm

我有这样的DataGrid

<DataGrid AutoGenerateColumns="True" HorizontalAlignment="Stretch" Name="dataGrid1" VerticalAlignment="Stretch" ItemsSource="{Binding DataList}" IsReadOnly="True"/>

在我的ViewModel中,我有这样的字段:

public ObservableCollection<ConsoleData> DataList { get; set; }

这种每秒调用的方法:

private void model_DataArrived(List<ConsoleData> dataList)
{
    DataList.Clear();
    dataList.ForEach(x => DataList.Add(x));
}

网格每秒显示一些实时数据和更新。

问题是 - 当我在网格中选择某一行时,选择会在一秒钟后重新生成(当新数据到达时)。

我想这可能是因为我每次Clear DataList

如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

在清除之前,选择当前所选的项目(如果有的话,选择一个唯一的标识符)然后尝试在更新时再次突出显示它,如果它不再存在则不要突出显示任何内容。

答案 1 :(得分:1)

如果新的dataSource仍然包含您最后选择的项目,并且您正在遵循MVVM模式。您需要做的就是在重新加载数据源后为PropertyChanged举起selecetdItem事件。确保您的viemModel实现了INotifyPropertyChanged接口。

修改

如果您不想时不时清除数据源。简单地说,使用ObservableCollection代替通用列表。它在内部实现INotifyCollectionChanged,因此您的集合中任何项目的添加或删除都将反映在您的用户界面上。

答案 2 :(得分:1)

我过去设置更新列表的方式是:

  1. 在对象(Update)中创建一个ConsoleData方法,您可以传递该对象的副本,并且对象会自行更新。该对象还需要实现INotifyPropertyChanged

  2. 在ViewModel中的model_DataArrived方法中查找所有匹配的对象,并使用步骤1中的Update方法更新对象。

  3. 查找所有新对象并将其添加到您的列表中(DataList)。

  4. 找到所有丢失的对象并将其从列表中删除(DataList)。