DataGrid - выбор сетки сбрасывается при поступлении новых данных - PullRequest
1 голос
/ 22 ноября 2011

У меня есть такая 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 ]

2 голосов
/ 22 ноября 2011

Перед очисткой выберите текущий выбранный элемент (уникальный идентификатор, если он у вас есть), затем попытайтесь снова выделить его при обновлении, а если его больше нет, просто не выделяйте ничего.

1 голос
/ 22 ноября 2011

В прошлом я настраивал списки обновлений:

  1. Создайте метод Update в своем объекте (ConsoleData), чтобы вы могли передать копию этого объекта и сам объект обновился. Объект также должен реализовать INotifyPropertyChanged.

  2. В вашем методе model_DataArrived во ViewModel найдите все подходящие объекты и используйте метод Update из шага 1 для обновления объектов.

  3. Найдите все новые объекты и добавьте их в свой список (DataList).

  4. Найдите все недостающие объекты и удалите их из списка (DataList).

1 голос
/ 22 ноября 2011

В случае, если новый источник данных все еще содержит ваш последний выбранный элемент и если вы следуете шаблону MVVM. Все, что вам нужно сделать, это вызвать событие PropertyChanged для вашего selecetdItem после перезагрузки источника данных. Убедитесь, что ваш viemModel реализует интерфейс INotifyPropertyChanged.

EDIT

И если вы не хотите время от времени очищать свой источник данных. Просто используйте ObservableCollection вместо общего списка. Он внутренне реализует INotifyCollectionChanged, поэтому любое добавление или удаление элемента в вашей коллекции будет отражено в вашем пользовательском интерфейсе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...