2013-11-21 128 views
0

我是WPF和C#的新手,並且主要是通過使用代碼示例構建我的第一個應用程序。我相信可能有更好的方法來做到這一點,我還沒有理解,所以我會向你們提出一些建議。wpf如何刷新綁定的viewmodel

我有一堆嵌套對象的treeview控件,這些嵌套對象從我也構建的WCF服務中下載到ObservableCollection viewmodel中。我在XAML的Windows.Resources中聲明瞭viewmodel。

我樹狀然後結合到靜態資源通過它的鍵名。

項= 「{綁定源= {StaticResource的MyCatalogModel},路徑=項目,模式=雙向,UpdateSourceTrigger =的PropertyChanged}」

在樹中的數據保存在本地的文件。當視圖模型被實例化時,它讀取該文件,或者如果該文件不存在,則創建該文件。

我現在有2個相關的問題。

  1. 有時導入的數據對象相當大,有很多嵌套的對象(子對象)。這需要很長時間來更新樹。我如何加快速度?我可以「關閉」通知ObservableCollection的變化的東西,並剛剛完成時重新加載(重新綁定)視圖模型?

  2. 我想讓用戶能夠基本清除樹中的所有項目並從頭開始。我有轉儲底層文件的代碼,正如我所說,當新的視圖模型被實例化時,它將被重新創建,但我不知道如何「重置」資源和樹的綁定。我該怎麼做呢?

感謝所有人的迴應和任何代碼片段將不勝感激!

+0

您可以通過1)將TreeView綁定到視圖模型上的一個屬性(就像您已經擁有'Items'一樣),從而加快TreeView的速度。 2)當你加載你的數據時,在本地變量中創建* new *'ObservableCollection'並將數據加載到它中。 3)最後,將局部變量賦值給'Items'屬性。這會導致TreeView重新綁定/刷新到已經填充的新ObservableCollection的內容,而不是更新所發生的每個INotifyCollectionChanged事件。 – Steve

回答

0

我有一個類似的問題,我在一個集合中有非常大量的數據 - 並且OnPropertyChanged事件正在爲集合中的每個項目觸發。我添加了一個擴展和一個方法來添加一個範圍到ObservableCollection。這是擴展的代碼。

public class SmartCollection<T> : ObservableCollection<T> 
{ 
    public SmartCollection() 
     : base() 
    { 
     _suspendCollectionChangeNotification = false; 
    } 


    bool _suspendCollectionChangeNotification; 

    protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) 
    { 
     if (!_suspendCollectionChangeNotification) 
     { 
      base.OnCollectionChanged(e); 
     } 
    } 

    public void SuspendCollectionChangeNotification() 
    { 
     _suspendCollectionChangeNotification = true; 
    } 

    public void ResumeCollectionChangeNotification() 
    { 
     _suspendCollectionChangeNotification = false; 
    } 


    public void AddRange(IEnumerable<T> items) 
    { 
     this.SuspendCollectionChangeNotification(); 
     int index = base.Count; 
     try 
     { 
      foreach (var i in items) 
      { 
       base.InsertItem(base.Count, i); 
      } 
     } 
     finally 
     { 
      this.ResumeCollectionChangeNotification(); 
      var arg = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset); 
      this.OnCollectionChanged(arg); 
     } 
    } 

} 

所以不是一個ObservableCollection的一個SmartCollection。我所做的是將我的對象集合構建到List中,然後調用AddRange方法並傳入對象列表。這大大提高了性能。

至於重建樹 - 如果它基於viewmodel。只是新增了它所綁定的視圖模型。

0

相同的老問題一次又一次出現的次數很驚人。對,我不知道你爲什麼BindingStaticResource,但這是一個壞主意。

在您的視圖模型只要創建ObservableCollection<T>類型的public屬性,設置它的實例爲你喜歡或不知道無論怎樣你的觀點的DataContext。確保在後面的代碼中正確實施INotifyPropertyChanged Interface,或者改爲declare a DependencyProperty。然後你就可以直接Bind這個屬性,讓我們稱之爲Items

<TreeView ItemsSource="{Binding Items}" ... /> 

當你擁有它設置了這種方式,那麼所有你需要做的,清空或重置TreeView這是(在視圖模型) :

Items = new ObservableCollection<YourItemDataType>(); 

至於速度,很難知道自己在做什麼,但WPF是已知的渲染大集合時正在緩慢。我無法幫助,對不起。