2011-01-05 22 views
1

我有幾個關於構建WPF MVVM應用程序的問題。WPF MVVM應用程序 - ICollectionView/Threading /常見問題

1)我使用ICollectionView對象來控制數據綁定,如ListView和ComboBox。我發現這是訪問/跟蹤這些控件的選定項目的最簡單方法。替換ICollectionView內容的最佳方法是什麼?目前,我正在做它像這樣:

private ICollectionView _files; 

public ICollectionView Files { 
    get { return _files; } 
} 

void _service_GetFilesCompleted(IList<SomeFile> files) { 
    this.IsProcessing = false; 
    _files = CollectionViewSource.GetDefaultView(files); 
    _files.CurrentChanged += new EventHandler(FileSelectionChanged); 
    OnPropertyChanged("Files"); 
} 

我不知道是否有必要每次刷新文件列表的時間來重新連接處理程序?

2)現在我已經掌握了自己的想法,我開始喜歡MVVM模式。然而,我不完全確定的一個概念是如何將通知發回到視圖。目前我正在通過綁定ViewModel上的屬性來完成此操作。例如,在上面的代碼中,我有一個「IsProcessing」屬性,用於確定是否顯示ProgressBar。這是推薦的方法嗎?

3)繼2)之後 - 似乎沒有一種標準的方式來處理MVVM應用程序中的異常。一個想法是我的ViewModel基類中有一個處理異常的方法。然後我可以注入一個負責轉發任何錯誤消息的IMessagingService。這個的具體實現可以使用MessageBox。

4)我有幾個任務需要異步執行。我沒有直接在我的服務中添加這個邏輯,而是創建了一個裝飾器服務,它在新線程上運行底層服務方法。它公開了一些我的ViewModel可以訂閱的事件。我列出了下面的代碼。據我所知,BackgroundWorker的是一個更安全的選擇,但不知道它是否適合同時運行多個異步任務?:

public void BeginGetFiles() 
    { 
     ThreadStart thread =() => { 
      var result = _serviceClient.GetUserFiles(username, password); 
      GetFilesCompleted(result.Files); 
     }; 

     new Thread(thread).Start(); 
    } 

最後,我意識到有一些MVVM的框架,處理一些這些項目要求。但是,我想了解如何使用內置功能實現上述功能。

感謝

回答

1

如果你有列表視圖和組合框,你真的應該考慮的ObservableCollection<>綁定到這些控件。從集合中添加和刪除項目將自動通知控件屬性已更改。

如果您正在進行後臺處理,您可以查看BackgroundWorker或DispatcherTimer以處理對UI的更新。這兩者都具有在UI線程上執行的功能,並且可以是線程安全的。

+0

我從不需要添加/刪除集合中的單個項目;該集合總是被替換。此外,ICollectionView似乎是從ListView獲取當前項目的最簡單方法 - 除非您可以建議替代方案。是的,我知道BackgroundWorker - 請參閱我的問題關於多個任務。 – 2011-01-05 17:39:18

0

要獲得從組合框中選擇的項目,露出INotifyCollectionChanged對象如的ObservableCollection並將其綁定到的ItemSource,然後創建另一個屬性當前項和結合ComboBox.SelectedItem(或ComboBox.SelectedValue如果需要的話),以它。更新集合時,您需要管理選擇。

從表面上看,ICollectionView看起來很明顯,但WPF實現確實會強迫你使用一些你真正不應該感到困擾的線程代碼。

我用ICollectionView,並在最近CollectionViewSource(用於過濾),並已成爲沮喪多少調度問題都躡手躡腳。今天,我可能將回到上述我所描述的方法。