我对 MVVM 模式很陌生,所以请多多包涵。我在 wpf +mvvm + prism 中看到了实现,其中所有视图都倾向于将 IView 作为最顶层的界面。然后各个模块中的视图有一个视图特定的接口,如 IViewA、IViewB 等,它们实现了 IView 接口。甚至 viewmodel 也有 IViewModel 最顶层的接口,并且后续模块有 IViewAViewModel , IViewBViewModel 等继承自 IViewmodel。IViewmodel 具有对 Iview 的引用,而 Iview 具有对 IViewModel 的引用。
namespace xxx.xxx.infrastructure
{
public interface IView
{
IViewModel ViewModel {get;set;}
}
public interface IViewModel
{
IView View {get;set;}
}
public abstract class ViewModelBase : IViewModel, INotifyPropertyChanged
{
public IView View {get;set;}
public ViewModelBase(IView view)
{
View = view;
View.ViewModel = this;
}
//INotifyPropertyChanged left out
}
}
namespace xxx.xxx.Modules.Customer
{
public interface ICustomerDetailsView : IView
{
}
public partial Class CustomerDetailsView : UserControl, ICustomerDetailsView
{
public CustomerDetailsView ()
{
InitializeComponent();
}
//Is this implementation acceptable?The view is supposed to have zero code in the code behind.....
public IViewModel ViewModel
{
get
{
return (ICustomerDetailsViewViewModel)DataContext;
}
set
{
DataContext = value;
}
}
}
public interface ICustomerDetailsViewViewModel : IViewModel
{
string Message {get;set;}
}
public class CustomerDetailsViewViewModel : ViewModelBase, ICustomerDetailsViewViewModel
{
//Will be injected by unity as i have set up mappings in module initilize.
public CustomerDetailsViewViewModel(ICustomerDetailsView view)
:base(view)
{
}
public string Message
{
//INotifyPropertyChanged left out for brevity
get;set;
}
}
我有几个问题。
1.)这是否违反了 MVVM,因为文件后面的代码应该是零代码?
2.)在 MVVM 视图模型中不应该担心视图或其合同?上面的实现不会破坏它吗?
3.)我不明白这个实现有什么用。事实上,这与 MVP 接壤,需要大量代码。
4.)如果这是一种可接受的实现方式,我是否需要为所有模块中的所有视图和视图模型提供接口。?