对于我的项目,我需要知道哪个 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/