如何在MVVM中刷新WPF列表视图、集合视图源中的列表项

zpf6vheq  于 2023-02-25  发布在  其他
关注(0)|答案(2)|浏览(284)

我有一个分配给人员的ObservableCollection,还有一个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是集合视图源类型的公共属性,并且
AllPeople是ObservableCollection类型的公共属性
我需要更改单击列表视图中某行时使用的图标。但要更新视图,我需要再次读取整个列表。由于我的列表有100多条记录,刷新列表需要很长时间。
有没有一种方法,我可以只刷新列表中的特定项目,并刷新它的UI。

5f0d552i

5f0d552i1#

    • 是的**,您的PersonViewModel应该实现INotifyPropertyChanged并在icon属性的setter中引发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"));
        }
    }
}
tgabmvqs

tgabmvqs2#

首先,在wpf的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。
你可以看看
IEnumerable
IQueryable
yield

相关问题