我对 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.)如果这是一种可接受的实现方式,我是否需要为我的所有模块中的所有视图和视图模型提供接口?
首先是 Rachel 的关于 viewmodel 的非常好的评论:
请记住,使用 MVVM,您的 ViewModel 就是您的应用程序。视图是
只是一个漂亮的界面,允许用户与您交互
视图模型。
1) IView 对我来说违反了 MVVM,但是 ui 的东西当然允许代码隐藏。 viewmodel 应该没有对视图的引用。请参阅 Hasith 的第一条评论
2)看我的块引用
3)我和你在一起 - 我从来没有在我的项目中使用类似的东西
4) 请以简单的方式进行 MVVM - 无耦合,使用 di、ioc、命令、行为,对我来说最重要的是:首先是 viewmodel :)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)