c# - 可以将 View 传递给 MVVM 中的 ViewModel 吗?

标签 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 模式?

最佳答案

是的,这会破坏 MVVM。正确构造的 View 模型不应该关心 View 是什么

您的代码中没有任何内容真正表明为什么您要传递该引用(除了将 View 公开为公共(public)属性,这是一个甚至更大的禁忌)但是有几种解决方法:

  • 将 View 作为接口(interface)传递并保存/公开
  • 使用中介在 View 模型/ View 之间传递任何必要的消息
  • 让 View 在 View 模型上调用它需要的任何方法,并让 View 模型引发 View 可以监听的事件。

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

还有一件事,它是“View Model”,而不是“Model View”

关于c# - 可以将 View 传递给 MVVM 中的 ViewModel 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32125433/

相关文章:

c# - 用于共享列表的 MVVM 应用程序中的列表模型是否可行?

c# - 将参数添加到 Razor 中的表单

c# - 单击一次部署和解决方案配置

c# - 多个线程使用 yield 访问 IEnumerable

wpf - 在 WPF XAML 中缩放复杂的 SVG 路径

c# - 如何在 TaskScheduler.FromCurrentSychronizationContext 的延续中使用 Task.Result?

c# - 如何使用 MVVM 将焦点设置到文本框?

c# - UWP ListView 数据模板绑定(bind)

c# - 使用属性属性在MVVM中进行验证

wpf - 网格 SharedSizeGroup - 列在无限循环中弹跳、调整大小