【问题标题】:MVVM question, Event fire in the ViewMVVM 问题,视图中的事件触发
【发布时间】:2010-07-12 12:33:48
【问题描述】:

我是 MVVM 和 WPF 的新手。所以请放轻松。

我在 MVVM 中有一个模型(模型 A),在 ViewModel 中有一个集合。 该集合以 ListView 的形式出现在视图中。 我有另一个模型(模型 B - 不是 ui 模型),每次列表视图发生变化时都需要做一些事情。

如何在选择更改时提醒模型 B? 正确的方法是什么?

  • 模型 A (ViewModel) 将触发,模型 B 将捕获的事件?
  • 通过模型 A 的附加属性?
  • 通过通知属性更改?
  • 通过从模型 B 向模型 A 发送中继命令?

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    使用发布/订阅者模式

    我个人会将命令从 VM 发送到 VM 并让它们更新模型

    希望对你有帮助

    【讨论】:

    • 我不喜欢添加像 messenger 或 unity 这样的外部工具包。命令听起来不错。但是我仍然有一个问题,如何将选择更改从 View 传递到 ViewModel?通过视图中的代码,还是有其他(很酷)的方式?
    • @AmirE:希望您的 ListView 绑定到 ViewModel 中的 Collection。同样,您必须将 View 中的 SelectedItem 属性绑定到 ViewModel 中的属性,这样您就可以在没有任何额外通知的情况下选择项目。
    • @AmirE 如果你不喜欢框架,那么 Puplish/Subscriber 和 Observer 只是指导你解耦事件的模式。他们刚刚完成了羽毛...还要寻找触发器(因为您不在silverlight上)和触发命令的行为 -> ICommand
    【解决方案2】:

    我会的

    1. 在 ViewModel A 中公开一个 ViewModel B 可以订阅的事件。然后,只要选择发生变化,我就会提出该事件。
    2. 利用 INotifyPropertyChanged 向 ViewModel B 发出通知

    我更喜欢选项 1,因为它使您想要做的事情更加明显。此外,它更高效(您没有过滤哪些属性更改然后执行某些操作的代码气味。)

    恕我直言,我认为中继命令只能用作视图和视图模型之间的接口,以帮助分离关注点。但是,当您从一个类到另一个类进行编程时,只需使用标准的 OOP 约定即可。

    所以伪代码可能看起来像这样:

    public class ViewModelA
    {
      public event EventHandler SelectedObjectChanged;
    
      public IList<MyObject> ObjectList {get;set;}
      public MyObject _SelectedObject;
      public MyObject SelectedObject
      {
        get { return _SelectedObject;}
        set 
        { 
          _SelectedObject = value; 
          if (SelectedObjectChanged != null) 
            SelectedObjectChanged(value); 
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-23
      • 1970-01-01
      • 2015-07-26
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多