MVVM标准化

2024-01-11

有人在Silverlight 发布 http://forums.silverlight.net/forums/t/159237.aspxMVVM 目前缺乏标准化,因此每个人都有自己的风格。

这就是为什么我和 WPF Disciples 的一些人正在积极讨论每个人都同意的 MVVM 元素。我完全理解我们以不同的方式实现了该模式,我们混合了几种模式,或者根据我们项目的需要创建我们自己的模式,或者让开发人员的生活更轻松。但是忘记这些困难或项目的特殊需要。让我们讨论一下大家都同意的 MVVM 模式的标准规则。我已经发布我的一些想法在这里 http://michaelsync.net/2010/02/03/rules-of-mvvm以及。

为什么选择MVVM?

  • Testabiltiy(ViewModel 比代码隐藏或事件驱动代码更容易进行单元测试)
  • 用户体验设计师和开发人员之间的明确分离
  • 增加视图的“可混合性”
  • 永远不需要更改模型来支持视图的更改
  • ViewModel 很少需要更改来支持视图的更改
  • 没有重复的代码来更新视图

视野中该做和不该做的事情

  • 不应包含任何要测试的逻辑:正如 Glenn 所说,MVVM 不是代码计数练习,我们可以在代码隐藏中编写代码。但你永远不应该编写任何你想测试的逻辑。例如:如果用户选择一个国家/地区,那么您希望在视图中显示州或城市的列表。这是业务需求,因此您应该进行单元测试来测试此逻辑。所以,你不应该把它写在代码隐藏中。
  • 可以是控件或数据模板
  • 保持视图尽可能简单。 :我们仍然可以在 XAML 中谨慎使用 Data Trigger 或 Value Converter 或 Visual State 或 Blend Behivor。
  • 如果某些内容不可绑定,请使用附加属性:

ViewModel 中该做什么和不该做什么

  • 视图和模型之间的连接器
  • 保持视图状态,值转换(您可以创建要在 ViewModel 中显示的数据结构,而不是使用 ValueConverter。例如:您需要显示名称而不是名字和姓氏。您的模型可以有名字和姓氏名称,但您可以在 ViewModel 中创建名称属性。)
  • 视图没有强或弱(通过接口)引用
  • 使 VM 尽可能可测试(例如,不调用 Singleton 类)
  • VM 中没有与控制相关的内容(因为如果您要更改视图,那么您也必须更改 VM。)

Model

  • 可以是数据模型、DTO、POCO、自动生成的域类代理和 UI 模型,具体取决于您希望如何分离域服务和表示层
  • 没有引用 ViewModel

您对此有何建议或意见?

我们小组中有一个分歧。有人说ViewModel中有View的接口就可以了。但也有人说,如果View Model有View的接口那就是MVP模式了。

我们的一位 MVVM 专家谈论 MVVM 与 MVP

视图 => 视图模型

  • MVVM视图直接绑定到ViewModel并通过数据绑定与VM对话
  • 在 MVP 中,视图绑定到挂在 SupervisingController 上的模型,或者根本不绑定(被动视图)。

视图模型 => 视图

MVVM

  1. INPC / 属性绑定
  2. Events
  3. 消息(事件聚合器/Messenger/RX 框架)
  4. 通过服务等中介
  5. 通过接口
  6. 通过委托(View 将委托传递给 VM,VM 可以使用该委托将其回调。例如,VM 可能会公开一个 SetActions 方法,View 会调用该方法传递委托。

MVP

在 MVP 情况下,标准是 Presenter 通过接口、数据绑定或通过属性(在被动视图的情况下)与视图进行对话。对于被动视图,属性不使用数据绑定,而是使用视图属性 getter 和 setter 直接设置控件值。

你觉得这个想法怎么样?

你认为ViewModel有View的接口可以吗?

如果您想添加更多,欢迎添加...:)

这篇文章的整体想法是为了在社区中获得对 MVVM 模式的相同理解。


我喜欢你写的。真正让我烦恼的事情之一是,很多人似乎将他们的虚拟机与他们的视图紧密耦合——如果你这样做,那么你可能还只是做旧的 XAML + 所有东西都被塞进了代码背后的东西。

我使用的模式是 MVVM 的一个轻微变体(但大部分是相同的)。就我个人而言,我喜欢将我的 ViewModel 作为接口提供给 View - 它使分离保持非常干净。这在做原型时有很多好处,视觉元素可以切换到视图中或从视图中切换出来,而对 ViewModel 影响很小或没有影响。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVVM标准化 的相关文章

随机推荐

  • C ++ 提升绑定性能

    绑定函数 使用 Boost Bind 时是否会对性能产生任何影响 正面或负面 也许 也许不是 这取决于 的结果std bind 或者也boost bind 是所谓的 绑定表达式 它具有由实现确定的不可知类型 这种类型是一个Callable
  • 将一些 WooCommerce 产品数据传递到 Contact Form 7 查询表

    After 当 WooCommerce 中所选变体缺货时显示表单 https stackoverflow com questions 66405033 display a form when the selected variation i
  • 使用来自 URL 的 HTML 中的 .svg 文件?

    我正在尝试在我的 html 中使用来自外部源的 svg 假设我有这个 svg https upload wikimedia org wikipedia commons 0 09 America Online logo svg https u
  • 功能组件嵌套与 props

    我对 React 还很陌生 我有一个关于架构和设计模式的问题 我已经完成了我的第一个项目 交互式图灵机测序仪 http reactiveturing herokuapp com 如果有人感兴趣的话 我发现自己经常声明嵌套函数 例如 func
  • 如何验证Fragments中的EditText并防止Fragment更改?

    说明 我有一个片段活动FirstRun其中包括 5碎片 with 滑动导航 第二个和第三个片段包含 2编辑文本需要用户填写 并且不需要为空或未填写 好的 我可以使用 OnTextChanged 侦听器验证字段 但用户有可能只是滑到下一个片段
  • 选择项目时 onNavigationItemSelected 不调用

    我使用以下代码在导航抽屉中添加页脚视图
  • Python Threading.Event半忙等待的更好解决方案

    我正在使用非常标准的 Threading Event 主线程到达一个运行循环的点 event wait 60 另一个阻塞请求 直到有可用答复为止 然后启动 event set 我希望主线程选择 40 秒 但事实并非如此 来自 Python
  • 我们可以在 SQLite 数据库 (Android) 中存储 .doc .pdf 和 .jpg 文件吗?

    是否可以在 SQLite 数据库中存储像 pdf doc 这样的文件并再次成功检索它们 文件必须完整且再次可读 我知道我们可以存储图像文件 但对于上述情况 即使我们可以存储给定的最大文件大小是多少 好 去吧 将每个文件存储在数据库中比仅使用
  • 如何对 Java 小程序进行签名以便在浏览器中使用?

    我正在尝试在我的网站上部署 Java 小程序 我还需要签名 因为我需要访问剪贴板 我已经遵循了我能找到的所有签名教程 但没有取得任何成功 这是我到目前为止所做的 在 NetBeans 中编写了一个小程序 它在小程序查看器中运行良好 用它制作
  • 如何从BeautifulSoup4中的html标签中找到特定的数据属性?

    有没有办法仅使用 html 中的 data 属性来查找元素 然后获取该值 例如 在 html 文档中使用以下行 ul 我如何检索Sdafdo39通过在整个 html 文档中搜索具有以下内容的元素data bin属性 更准确一点 item d
  • 动态类型保护函数

    我想创建一个类型保护函数来检查对象中的特定键是否具有例如Astring价值 如果我知道键名 这很容易 const data object a one b two c three function hasStringKeyA data any
  • Passport-saml 和 SAML 加密

    我是新来的passport and passport saml 我正在尝试建立一个Node js使用我们大学的 Shibboleth 身份提供商进行单点登录的服务器 我非常接近让一切正常工作 但在 login callback 期间遇到了障
  • 在 Visual Studio 2012 中将 .NET Framework 4.5 降级到 4 以获取 C++ CLR 支持的 DLL 项目?

    当链接 Visual C NET Framework 4 0 支持的项目时 我收到此错误 因为我添加了 C CLR DLL 与 4 5 NET Framework 的引用 error CS0246 The type or namespace
  • 如何在 xml 中设置形状的背景?

    我刚刚使用 android 形状创建了一个红色圆圈
  • Spring Boot:java.time.Duration 的默认序列化从 String 更改为 Number

    我们最近从 Spring Boot 2 1 9 升级到 2 2 1 这导致我们的测试失败 调查得出的结果是 java time Duration默认情况下 类型现在以不同的方式序列化 而不是有字符串 PT15M 在我们现在得到的 JSON
  • 多对象绘制(OpenGL)

    问题是我不知道如何正确绘制两个对象 因为我的另一个对象没有被绘制 这是主要代码 GLuint VertexArrayID glGenVertexArrays 1 VertexArrayID glBindVertexArray VertexA
  • 获取给定周年、给定月份和给定周的开始和结束日期

    如何在 c 4 0 中获取给定年份 int 给定月份 int 和给定周 int example Year 2011 Month 07 week 04 的开始和结束日期 提前致谢 2011 年的开始日期为 07 月 该月的周数为 04 Goo
  • Segue 传递数据后如何重新加载 tableView 数据

    我有两个表视图 一种是用户单击的 另一种是显示数据的 当用户单击第一个表视图中的单元格时 将对我的 firebase 数据库进行查询 并将查询存储在数组中 然后我通过 segue 传递数据 我使用了属性观察器 因此我知道正在设置变量 通过使
  • Ruby 类实例变量与类变量

    I read Ruby 实例变量何时设置 https stackoverflow com questions 826734 when do ruby instance variables get set但何时使用类实例变量我有两种想法 类变
  • MVVM标准化

    有人在Silverlight 发布 http forums silverlight net forums t 159237 aspxMVVM 目前缺乏标准化 因此每个人都有自己的风格 这就是为什么我和 WPF Disciples 的一些人正