2010-07-21 3 views
2

У меня есть ObservableCollection назначены Люди и имеют PersonViewModel и PeopleViewModelКак обновить ListItem в WPF ListView, CollectionViewSource в MVVM

_people = GetAll().ToList(); 
List<PersonViewModel> allPeople = (from person in _people 
            select new PersonViewModel(person)).ToList(); 
AllPeople = new ObservableCollection<WorkOrderListItemViewModel>(allOrders); 
AllPeopleCollection.Source = AllPeople; 

где
AllPeopleCollection является публичной собственности типа CollectionViewSource и
AllPeople является общедоступной собственностью типа ObservableCollection

Мне нужно изменить значок, который я использую для строки в списке, щелкнув этот элемент. Но чтобы обновить представление, мне нужно снова прочитать весь список. Поскольку мой список содержит более 100 записей, для обновления списка требуется много времени.

Есть ли способ, который я могу обновить только в списке и обновить его в пользовательском интерфейсе.

+2

Я считаю, если сами ваши детали реализации INotifyPropertyChanged, это должно исправить. – Firoso

ответ

3

да, ваши PersonViewModel должны осуществлять INotifyPropertyChanged и поднять событие PropertyChanged в инкубаторе собственности значок (так он поднял автоматически после каждого обновления). Это приведет к обновлению GUI, если ваши привязки верны.

Код:

public class PersonViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private YourIconType _Icon; 
    public YourIconType Icon 
    { 
     get { return _Icon; } 
     set 
     { 
      _Icon = value; 
      if (PropertyChanged != null) 
       PropertyChanged.Invoke(this, 
        new PropertyChangedEventArgs("Icon")); 
     } 
    } 
} 
+0

Я уже реализую это в своем базовом классе .. и запускаю OnProperty Changed for Collection – crazy9

+1

да, но это просто обновляется, если сама коллекция изменяется (если элемент добавлен или удален), а не отдельные элементы, если свойство изменения позиции. – andyp

0

Прежде всего, ваш счетчик записей на самом деле ничего перед ListView МОФ как он использует VirtualizingStackPanel.

Помимо точного решения PropertyChange Notification, вы также должны рассмотреть возможность взглянуть на концепцию deferred execution. Кажется, вы превратили все в список, который привел бы к принудительному перечислению результирующего набора сразу.

Рассмотрим код:

_people= GetAll().ToList(); 
//The result of GetAll is enumerated and a solid list is created 

List<Person> allPeople = (from person in _people 
          select new PersonViewModel(person)).ToList(); 
// another list created 

AllPeople = new ObservableCollection<PersonViewModel>(allPeople); 
// ObservableCollection created out of list 

Давайте настроить его немного:

_people= GetAll(); // The result is just referred by _people 

IEnumerable<Person> allPeople = (from person in _people 
           select new PersonViewModel(person)); 
// IEnumerable is just provided with a query. No other operation is done 

AllPeople = new ObservableCollection<PersonViewModel>(allPeople); 
// The ObservableCollection requests element from allPeople 
// which in turn requests from the query 
// which in turn requests from _people 
// which enumerates the result of GetAll() and yields the result. 

Таким образом, вы можете избежать создания временных списков.

Кроме того, даже метод GetAll() может быть создан для возврата IEnumerable, если это не так.

Вы могли бы взглянуть на
IEnumerable
IQueryable
yield

+0

Спасибо за предложение сделать Список в IEnumerable Collection. Моя главная проблема приходит здесь IEnumerable allPeople = (от лица в _people выбрать новый PersonViewModel (человек)); , поскольку у меня есть много методов, вызывающих задание свойств в PersonViewModel. Для того, чтобы каждая запись проходила через все методы, требуется много времени. Но теперь после ввода его в IEnumerable это не занимает много времени , но когда точка отладки переходит в AllPeople = new ObservableCollection (allPeople); линия Требуется некоторое время для загрузки – crazy9

+0

@ user311945: В какой-то момент в любом случае должен быть создан сплошной список и, следовательно, время. Но это не должно занимать много времени, как вы указываете. Должно быть меньше секунды для тысяч предметов. Можете ли вы опубликовать код конструктора PersonViewModel и другие вещи, которые, по вашему мнению, требуют времени. Используйте класс Секундомер. – Amsakanna

Смежные вопросы