Как обновить ListItem в WPF ListView, CollectionViewSource в MVVM - PullRequest
2 голосов
/ 21 июля 2010

У меня есть ObservableCollection, назначенная для People, и PersonViewModel и PeopleViewModel

_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 ]

3 голосов
/ 21 июля 2010

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

Код:

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 голосов
/ 21 июля 2010

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

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

Давайте рассмотрим ваш код:

_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
доходность

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