私はMVVMパターンにまったく慣れていないので、ご容赦ください。私は、すべてのビューが最上位のインターフェイスとして IView を持つ傾向がある wpf +mvvm + プリズムの実装を見てきました。次に、それぞれのモジュールのビューには、IView インターフェイスを実装する IViewA、IViewB などのビュー固有のインターフェイスがあります。ビューモデルにも IViewModel の最上位インターフェイスがあり、後続のモジュールには IViewmodel から継承する IViewAViewModel 、 IViewBViewModel などがあります。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.)これが実装に受け入れられる方法である場合、すべてのモジュールのすべてのビューとビューモデルのインターフェイスが必要ですか?