【问题标题】:In M-V-VM where does my code go?在 M-V-VM 中,我的代码在哪里?
【发布时间】:2011-03-02 19:37:21
【问题描述】:

所以,我希望这是一个非常基本的问题。

我有一个通过添加服务参考添加的 Web 服务。它有一些方法可以在我的数据库中获取列表和获取特定表的详细信息。

我正在尝试按如下方式设置 UI:

  1. 应用加载
    1. 加载服务代理
    2. 调用GetList();方法在ListBox控件中显示结果
  2. 用户双击列表框中的项目,显示带有“详细”视图的模式对话框

我对使用 MVVM 非常陌生,因此我们将不胜感激。

附加信息:

// Service Interface (simplification):

interface IService 
{
    IEnumerable<MyObject> GetList();
    MyObject GetDetail(int id);
}

// Data object (simplification)
class MyObject
{
    public int ID { get; set; }
    public string Name { get; set; }
}

我想我应该有这样的东西:

MainWindow
    MyObjectViewUserControl 
        Displays list
        Opens modal window on double click

具体问题:

  1. 我的 ViewModel 类会是什么样子?
  2. 处理双击的代码在哪里?
    1. 在 UserControl 内部?
    2. Commands 怎么样,这会是它们的一个很好的应用吗?

抱歉,细节太长了,但我对整个事情都很陌生,而且我受过的教育不足以提出正确的问题。

我从 wpf.codeplex.com 查看了 MVVM 示例,但我还没有完全明白,因为它看起来很混乱。

【问题讨论】:

    标签: .net wpf design-patterns mvvm


    【解决方案1】:

    请参阅我的 yodelay 项目中的 RegularExpressionViewModel 示例。

    您的大部分代码将放在您的 ViewModel 中。视图中应该包含的唯一代码是将视图事件连接到 ViewModel 的代码。通常在 View 中不需要代码,因为大部分连接都可以由 DataBinding 处理。

    我使用具有依赖注入的表示抽象层与对话框进行通信。

    【讨论】:

      【解决方案2】:

      您将拥有 2 个 ViewModel,因为您有 2 个视图

      1 个 ViewModel 将拥有

      1. 您的服务代理
      2. 列表
      3. ShowDetailFor(string selectedItemFromList) 这应该会创建一个新的 VM2 实例,将其传递给 ctor 中的服务代理并在 VM2 上调用 ShowDetail。

      2 ViewModel 会有

      1. MyObject(如果只是messagebox,不需要ViewModel)
      2. ShowDetail(int id)

      有了 ViewModel 后,使用 WPF 绑定和命令将数据从 VM 连接到 XAML

      用于用户控制的 MVVM 变得有点复杂,所以如果可能的话,暂时远离 UserControls。

      【讨论】:

        【解决方案3】:
        1. 您的虚拟机将具有:
          • 包含绑定到 ListBox 的项的 ObservableCollection。
          • CurrentItem 绑定到列表中当前选定的项目
          • 绑定到双击并调用逻辑以显示详细视图的 DelegateCommand(请参阅 MVVM 执行此操作的方法,类似于服务或事件聚合器的方法)
          • 调用 GetList() 然后填充此集合的逻辑
        2. 处理双击的代码将转到 VM(见上文)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-04-10
          • 2011-09-06
          • 2010-09-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-01-07
          相关资源
          最近更新 更多