gpt4 book ai didi

wpf - 为什么要在 viewmodel 上实现接口(interface)并在 mvvm 中查看

转载 作者:行者123 更新时间:2023-12-03 21:00:36 42 4
gpt4 key购买 nike

我对 MVVM 模式很陌生,所以请多多包涵。我在 wpf +mvvm + prism 中看到了实现,其中所有 View 都倾向于将 IView 作为最顶层的界面。然后各个模块中的 View 有一个 View 特定的接口(interface),如 IViewA、IViewB 等,它们实现了 IView 接口(interface)。甚至 viewmodel 也有 IViewModel 最顶层的接口(interface),并且后续模块有 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 View 模型中不应该担心 View 或其契约(Contract)?上面的实现不会破坏它吗?

3.)我不明白这个实现有什么用。事实上,这与 MVP 接壤,需要大量代码。

4.)如果这是一种可接受的实现方式,我是否需要为所有模块中的所有 View 和 View 模型提供接口(interface)。?

最佳答案

首先是 Rachel 关于 viewmodel 的非常好的评论:

Remember, with MVVM your ViewModels are your application. The View is just a pretty interface that allows users to interact with your ViewModels.



1) IView 对我来说违反了 MVVM,但对于 ui 的东西当然允许使用代码隐藏。 viewmodel 应该没有对 View 的引用。见 Hasith 的第一条评论

2)看我的 block 引用

3)我和你在一起——我从不在我的项目中使用类似的东西

4) 请用简单的方法做 MVVM - 没有耦合,使用 di、ioc、命令、行为,对我来说最重要的是:首先是 viewmodel :)

关于wpf - 为什么要在 viewmodel 上实现接口(interface)并在 mvvm 中查看,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11463453/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com