【问题标题】:WPF MVVM application - ICollectionView/Threading/General QuestionsWPF MVVM 应用程序 - ICollectionView/线程/一般问题
【发布时间】: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 框架项目可以处理其中的一些需求。但是,我想了解如何使用内置功能实现上述目标。

谢谢

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    如果你有 ListViews 和 ComboBoxes,你真的应该考虑用ObservableCollection&lt;&gt; 绑定到这些控件。在集合中添加和删除项目将自动通知控件属性已更改。

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

    【讨论】:

    • 我永远不需要从集合中添加/删除单个项目;集合总是被替换。此外 ICollectionView 似乎是从 ListView 获取当前项目的最简单方法 - 除非您可以提出替代方案。是的,我知道 BackgroundWorker - 请参阅我关于多项任务的问题。
    【解决方案2】:

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

    从表面上看,ICollectionView 似乎是显而易见的选择,但 WPF 实现确实迫使您处理一些您确实不应该为之烦恼的线程代码。

    我最近使用了 ICollectionView 和 CollectionViewSource(用于过滤),并且对潜入的调度程序问题感到沮丧。今天我可能会恢复到我上面描述的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多