为什么要在mvvm中的viewmodel和view上实现一个接口

2023-12-20

我对 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(使用前将#替换为@)

为什么要在mvvm中的viewmodel和view上实现一个接口 的相关文章

随机推荐

  • 处理宏注释时无法访问父级成员

    我有点被以下内容挡住了 宏注释 情况 假设我有一个名为 factory哪个 旨在产生一个apply相应伴随对象中带注释的特征的方法 例如 给定trait A factory trait A val a1 Int 预期生成的代码如下 obje
  • 扩展模板解析器:CodeIgniter...嵌套数组的问题

    我目前正在使用扩展模板解析器库 http codeigniter com forums viewthread 155859 对于代码点火器 我在尝试模板解析嵌套数组时遇到了问题 这是我正在向视图提供的数组 Array users gt Ar
  • 如何从 C++ 向量中获取 2 个随机(不同)元素

    我想从 std vector 中获取 2 个随机不同的元素 我怎样才能做到这一点 它很快 在我的算法中已经完成了数千次 它是优雅的 元素选择确实是均匀分布的 为了优雅和简单 void Choose const int size int fi
  • 如何为复杂的文档结构编写 MongoTemplate 查询和条件?

    我是 MongoTemplate 的新手 我想定义一个 org springframework data mongodb core query Query 和 org springframework data mongodb core qu
  • Makefile 和符号链接

    我在 makefile 方面遇到了一个奇怪的问题 我只想在 makefile 中设置符号链接 但在一台机器上收到错误消息 Linux 2 6 18 238 12 1 el5 make execvp ln Too many levels of
  • 如何在 Cocoa Mac 中以编程方式关闭窗口?

    如何以编程方式关闭 cocoa mac 中的窗口 我使用按钮单击从第一个窗口 xib 打开了第二个窗口 xib 我需要在打开或单击按钮时以编程方式关闭第一个窗口 xib 我怎样才能做到这一点 Apple 有一些有用的示例代码笔尖装载 htt
  • iconv:从 CP1252 转换为 UTF-8

    我正在尝试将 CP1252 编码的字符串 转换为 UTF 8 我尝试过这个命令 iconv c f WINDOWS 1252 t UTF 8 test txt 运气不好 得到了一些奇怪的结果 我尝试在这里输入相同的字符串 他们能够毫无问题地
  • 无法访问sql server配置管理器

    我在删除 SQL Server 2008 R2 Express 后安装了 SQL Server 2008 R2 评估版 卸载后 SQL Server 配置管理器仍然可以访问 但现在无法再访问 并出现以下错误 无法连接到 WMI 提供程序 您
  • 如何设置 VTCompressionSession 的 MaxH264SliceBytes 属性

    iOS VTCompressionSession有一个属性是kVTCompressionPropertyKey MaxH264SliceBytes 但是 我无法设置kVTCompressionPropertyKey MaxH264Slice
  • 如何扩展或覆盖 AngularJS 中现有的过滤器?

    是否可以扩展现有的 标准 过滤器 date number lowercaseETC 就我而言 我需要从 YYYYMMDDhhmmss 格式解析日期 所以我想扩展 或覆盖 date过滤而不是我自己写 我更喜欢实施装饰器模式 http en w
  • Java POS 打印机错误

    我是Java新手 我正在使用java开发POS应用程序 我为这个项目购买了一台 Epson POS 打印机 打印机型号是EPSON TM U220 我已经安装了JavaPos并且 我的代码片段如下 但运行时我收到此错误 感谢是否有人可以帮助
  • 立即音频输入和输出 Android

    在我的 Android 应用程序中 我想从智能手机的麦克风中获取一些音频并立即播放 就像麦克风一样 没有延迟 我目前正在考虑使用AudioRecord and AudioTrack课程 根据我读过的内容 但我不太确定如何继续 我查看了 St
  • devops REST API:无法使用 PATCH 方法更新工作项状态

    我正在使用 DevOps Rest api 来获取一些信息 POST 方法对我来说效果很好 我想更新我的工作项目的状态 为此 我需要使用 PATCH 方法 这不起作用 并且没有给出任何类型的错误 https learn microsoft
  • 在已 root 的 Android 设备上读取或写入 /data 中的文件 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试以编程方式读取 写入已 root 的手机上 data 目录中的文件 我先来外壳执行 su确保我的程序获得超级用户访问权限 效
  • 更改活动选项卡视口大小,如开发工具响应视图

    在 Chrome 扩展中 我想更改视口大小 例如 DevTools 响应式视图 我正在调查https developer chrome com extensions tabs type ZoomSettingsMode https deve
  • 删除mysql表中的所有记录[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我正在尝试从表中删除所有记录 我的查
  • Django:测试页面是否已重定向到所需的网址

    在我的 Django 应用程序中 我有一个身份验证系统 因此 如果我不登录并尝试访问某些个人资料的个人信息 我会被重定向到登录页面 现在 我需要为此编写一个测试用例 我得到的浏览器响应是 GET myprofile data some id
  • 如何在 MySQL 数据库中存储 UTC ISO8601 日期?

    我有数千个以下格式的日期 2011 10 02T23 25 42Z 又名 UTC 格式的 ISO 8601 我应该使用什么 MySQL 数据类型在 MySQL 数据库中存储这样的 ISO8601 日期 例如 Datetime timesta
  • 如何在 Keycloak 中指定刷新令牌的生命周期

    Keycloak 刷新令牌的生命周期为 1800 秒 refresh expires in 1800 如何指定不同的过期时间 在 Keycloak 管理 UI 中 只能指定访问令牌的生命周期 正如评论中指出的 库巴西蒙诺夫斯基 https
  • 为什么要在mvvm中的viewmodel和view上实现一个接口

    我对 MVVM 模式还很陌生 所以请耐心等待 我见过 wpf mvvm prism 中的实现 其中所有视图都倾向于将 IView 作为最顶层的界面 然后 各个模块中的视图都有一个特定于视图的接口 如 IViewA IViewB 等 它们实现