可以将视图传递给MVVM中的ViewModel吗?

时间:2015-08-20 18:12:09

标签: c# wpf mvvm

对于我的项目,我需要知道哪个View正在使用我的ViewModel

所以我创建了这个ViewModel:

public class HistoriqueViewModel : INotifyPropertyChanged
{
   public HistoriqueViewModel(MetroWindow view)
    {
        this.MetroWindow = view;          
        this.ExportCommand = new RelayCommand(Export_Ex);          
    }

    private MetroWindow _metroWindow;
    public MetroWindow MetroWindow
    {
        get { return _metroWindow; }
        set
        {
            if (Equals(value, _metroWindow)) return;
            _metroWindow = value;
            OnPropertyChanged();
        } 
   } 
   //.........
 }     

在View构造函数中:

 public partial class ViewHisto : MetroWindow
{
    public ViewHisto()
    {
        InitializeComponent();
        DataContext=new HistoriqueMV(this) ;
    }

 } 

它对我来说很完美,但我想知道这是否打破了MVVM模式?

1 个答案:

答案 0 :(得分:3)

是的,这打破了MVVM。正确构建的视图模型不应该关心视图是什么

您的代码中没有任何内容真正暗示为什么您正在传递该引用(除了将视图公开为公共属性,这是一个甚至更大 no-no)但有几种方法:

  • 将视图作为界面传递并保持/公开
  • 使用中介传递视图模型/视图之间所需的任何消息
  • 让视图调用视图模型上所需的任何方法,并让视图模型引发视图可以侦听的事件。

上述任何一种方法都可以提供比你正在使用的方法更好的解耦。

另一件事,它的“视图模型”,而不是“模型视图”