我有幾個關於構建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的框架,處理一些這些項目要求。但是,我想了解如何使用內置功能實現上述功能。
感謝
我從不需要添加/刪除集合中的單個項目;該集合總是被替換。此外,ICollectionView似乎是從ListView獲取當前項目的最簡單方法 - 除非您可以建議替代方案。是的,我知道BackgroundWorker - 請參閱我的問題關於多個任務。 – 2011-01-05 17:39:18