WPF MVVM应用程序 - ICollectionView / Threading / General Questions

时间:2011-01-05 16:12:23

标签: wpf mvvm

我有一些关于构建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框架项目可以处理其中一些要求。但是,我想了解如何使用内置功能实现上述功能。

由于

2 个答案:

答案 0 :(得分:1)

如果你有ListViews和ComboBox,你应该考虑ObservableCollection<>来绑定这些控件。添加和删​​除集合中的项目将自动通知控件属性已更改。

如果您正在进行后台处理,可以查看BackgroundWorker或DispatcherTimer来处理UI的更新。它们都具有作用于UI线程的能力,并且可以是线程安全的。

答案 1 :(得分:0)

要从组合框中获取所选项,请公开一个INotifyCollectionChanged对象(如ObservableCollection)并将其绑定到itemsource,然后为当前项创建另一个属性并将ComboBox.SelectedItem(或ComboBox.SelectedValue,如果需要)绑定到它。更新集合时,您需要管理选择。

从表面上看,ICollectionView似乎是一个显而易见的选择,但WPF实现确实迫使您处理一些您真正不应该感到困扰的线程代码。

我最近使用了ICollectionView和CollectionViewSource(用于过滤)并且已经对有多少调度程序问题感到沮丧。今天我可能会回到上面描述的方法。