【问题标题】:MVVM and window listsMVVM 和窗口列表
【发布时间】:2009-05-10 06:08:20
【问题描述】:

我正在编写一个允许用户浏览数据的应用程序,并且我想使用 FireFox UI 样式:允许用户打开任意数量的窗口,每个窗口都包含任意数量的选项卡。我也想尽可能地使用 Model-View-ViewModel 模式来做到这一点。

在 MVVM 中打开一个新标签应该很容易处理。制作 TabViewModel 的 ObservableCollection,将该集合绑定到 TabControl 的 ItemsSource,然后打开一个新选项卡理论上就像向集合中添加一个新的 TabViewModel 一样简单。

这是我感兴趣的问题:有没有办法做同样的事情来打开一个新的窗口?即,将 WindowViewModel 的 ObservableCollection 数据绑定到...应用程序的 Windows 集合的 ItemsSource?...这样当我将新的 WindowViewModel 添加到可观察集合时,会自动打开一个新窗口?然后将其绑定到应用启动中,这样我就无需设置 StartupUri,而是将第一个 WindowViewModel 添加到集合中?

由于我实际上无法对 Application.Windows 进行数据绑定,因此 ViewModel 层的最佳方式是:

  1. 添加新的 WindowViewModel 并自动出现新的 Window;
  2. 移除 WindowViewModel 并使其窗口自动关闭。
  3. 如果用户关闭窗口,则从集合中删除 WindowViewModel。

我可以编写自己的对象来监视 INotifyCollectionChanged 并打开/关闭窗口以响应收集事件,但我不确定这是否是最好的方法 - 如果是,我不确定最好的方法将其挂接到应用程序的方法。有人对解决此问题的最佳方法有想法吗?

【问题讨论】:

    标签: wpf data-binding mvvm


    【解决方案1】:

    MVVM 的重点是,ViewModel 不必自己(详细)关注如何 View 将如何对 ViewModel 中的变化做出反应。

    一种可能性是在 View 中使用简单的跟踪算法侦听 ViewModel 中的 CollectionChanged 事件,在旅途中创建和销毁 Windows:

    Dictionary<WindowModel, WindowView> _cache = new;
    void WindowModelListChangedHandler(sender, args) {
        switch(args.Action) {
            case Add:
                _cache[args.NewItem] = new WindowView(args.NewItem);
                _cache[args.NewItem].Show();
                break;
            case Remove:
                // ...
        }    
    }
    

    【讨论】:

      猜你喜欢
      • 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
      相关资源
      最近更新 更多