2010-07-21 40 views
2

我有一个ObservableCollection分配到人民 并有PersonViewModel 和PeopleViewModel如何刷新在WPF的ListView一个ListItem,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条记录,刷新列表需要很长时间。

有没有一种方法,我只能刷新列表中的特定项目并在UI上刷新它。

+2

我相信,如果你的项目本身执行INotifyPropertyChanged,这应该修复它。 – Firoso 2010-07-21 18:00:17

回答

3

,你PersonViewModel应该实现INotifyPropertyChanged,提高在图标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")); 
     } 
    } 
} 
+0

我已经在我的基类实现...并触发Onproperty已更改集合 – crazy9 2010-07-23 17:22:15

+1

是的,但只是更新如果集合本身发生更改(如果项目被添加或删除),而不是单个项目,如果属性项目更改。 – andyp 2010-07-23 22:58:18

0

首先,你的记录数实在没有什么在WPF的ListView的前面,因为它利用了VirtualizingStackPanel的。

除了PropertyChange通知的确切解决方案之外,您还应该考虑查看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集合的建议。 我的主要关注点在这里 IEnumerable allPeople =(来自人物中的人 选择新的PersonViewModel(人)); 因为我有很多方法调用PersonViewModel设置属性。它使用需要花费大量的时间为每个记录通过所有方法。 但现在把它放到IEnumerable后,它不需要太多时间 但调试点去 AllPeople =新的ObservableCollection (allPeople); line 加载 – crazy9 2010-07-23 18:47:00

+0

@ user311945需要一些通知时间:无论如何,必须创建实体列表,因此需要时间。但它不应该花很多时间,如你所指定的。数千件物品应该少于一秒。你可以发布PersonViewModel构造函数的代码和其他你觉得消耗时间的东西。使用秒表类。 – Amsakanna 2010-07-23 19:32:39