数据网格-当新数据到达时,网格选择被重置

本文关键字:数据 网格 选择 数据网 新数据 | 更新日期: 2023-09-27 18:15:22

我有这样的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));
}

Grid显示一些实时数据并每秒更新。

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

我猜这可能是因为我每次都Clear DataList ?

如何解决这个问题?

数据网格-当新数据到达时,网格选择被重置

在清除之前,选择当前选中的项目(如果你有一个唯一标识符),然后尝试在更新时再次突出显示它,如果它不再存在,就不要突出显示任何东西

我过去建立更新列表的方法是:

  1. 创建一个Update方法在你的对象(ConsoleData),你可以传递该对象的副本和对象更新自己。对象还需要实现INotifyPropertyChanged

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

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

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

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

编辑

如果你不想时不时地清除你的数据源。简单地说,使用ObservableCollection来代替泛型列表。它内部实现了INotifyCollectionChanged,所以任何添加或删除的项目在您的集合将反映在您的UI