【发布时间】:2011-01-05 16:12:23
【问题描述】:
我有几个关于构建 WPF MVVM 应用程序的问题。
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 框架项目可以处理其中的一些需求。但是,我想了解如何使用内置功能实现上述目标。
谢谢
【问题讨论】: