2010-07-21 73 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