我有这样的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
?
如何解决这个问题?
答案 0 :(得分:2)
在清除之前,选择当前所选的项目(如果有的话,选择一个唯一的标识符)然后尝试在更新时再次突出显示它,如果它不再存在则不要突出显示任何内容。
答案 1 :(得分:1)
如果新的dataSource仍然包含您最后选择的项目,并且您正在遵循MVVM模式。您需要做的就是在重新加载数据源后为PropertyChanged
举起selecetdItem
事件。确保您的viemModel实现了INotifyPropertyChanged
接口。
修改强>
如果您不想时不时清除数据源。简单地说,使用ObservableCollection代替通用列表。它在内部实现INotifyCollectionChanged
,因此您的集合中任何项目的添加或删除都将反映在您的用户界面上。
答案 2 :(得分:1)
我过去设置更新列表的方式是:
在对象(Update
)中创建一个ConsoleData
方法,您可以传递该对象的副本,并且对象会自行更新。该对象还需要实现INotifyPropertyChanged
。
在ViewModel中的model_DataArrived
方法中查找所有匹配的对象,并使用步骤1中的Update
方法更新对象。
查找所有新对象并将其添加到您的列表中(DataList
)。
找到所有丢失的对象并将其从列表中删除(DataList
)。