【问题标题】:Passing object to viewmodel将对象传递给视图模型
【发布时间】:2012-11-06 19:21:56
【问题描述】:

关于 MVVM 模式的问题,我认为我错了。

当视图中发生触地事件时,我想弹出一条消息,即:

private void marker_TouchDown(MessageObject msgData)
{
    CustomMessageControl message = new CustomMessageControl() {Width = 610, Height = 332};
    CustomMessageViewModel messageVM = new CustomMessageViewModel(msgData);
    message.DataContext = messageVM;
    //Add to canvas
}

我的视图模型:

public class CustomMessageViewModel
{
    public MessageObject message { get; set; }

    public CustomMessageViewModel(MessageObject message)
    {
        this.MessageObject = message;
    }
}

这可行,但感觉不对。这是填充视图模型的可接受方式吗?

【问题讨论】:

  • 通常视图模型将使用 INPC 接口 (msdn.microsoft.com/en-us/library/…) 来支持通知视图/消费者属性已更新。在这种情况下附加时,我强烈建议不要将代码中的数据上下文重新定义为新的视图模型。
  • 感谢 Quinton,我了解 INPC 的使用。我可能从字面上看这个,但这里有人点击一个视图,我想启动一个新视图,传递一些与他们点击的点相关的数据。
  • 请原谅我浏览了代码,您确实在做通常被认为是正确的事情,它在代码中可能看起来不那么漂亮,但它是实例化数据并将数据传递给视图模型的标准方式,有几个 MVVM 框架可以帮助您在设计中缓解这种情况,您可能会感兴趣,但如果您想手动处理这一切,这通常是公认的方法。
  • @QuintinRobinson 不正确,视图模型正在创建用户界面元素;这违反了 MVVM 支持的关注点分离。
  • @casperOne 你说得对,对不起,我没有说清楚,控件的生成不是我所指的,而是用相关数据实例化视图模型。

标签: c# mvvm


【解决方案1】:

我认为您在视图模型中创建控件时违反了 MVVM。这是不可测试的,您的视图模型必须现在创建控件,这不应该是测试的要求(这强调了 UI 和视图模型之间缺乏关注点分离) .

您的视图模型完全可以接受触发它自己的事件,而不是创建控件。在这种情况下,您将传递您希望对话框/覆盖/控件绑定到的视图模型,如下所示:

public class CustomMessageControlEventArgs : EventArgs
{
    public CustomMessageViewModel CustomMessageViewModel { get; set; }
}

public event EventHandler<CustomMessageControlEventArgs> 
    ShowCustomMessageControl;

private void marker_TouchDown(MessageObject msgData)
{
    // Create the view model.
    var message = ...;

    // Get the events.
    var events = ShowCustomMessageControl;

    // Fire.
    if (events != null) events(this, 
        new CustomMessageControlEventArgs {
            MessageObject = new CustomMessageViewModel(msgData)
        });
}

然后,在您的 UI 代码中,您将绑定到该事件,然后为该事件显示适当的用户界面。

请记住,MVVM 并不是严格意义上的能够在 XAML 中声明所有内容或通过只是数据绑定将数据绑定到 UI,它是关于正确分离代码。

您希望将显示的内容(视图模型)的 what 与显示的内容(UI)的 方式 分开;在触发事件时,您将保持关注点分离。

是的,您必须在后面编写一些代码(或者您可以通过属性通知更改来完成,但坦率地说,它更丑陋),但它保持了分离并允许轻松测试,而无需引入任何用户界面元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    相关资源
    最近更新 更多