MVVM模式下如何正确【视图绑定+数据】

news/2024/5/7 11:52:11/文章来源:https://blog.csdn.net/m0_71524094/article/details/129327201

概述

我如何(不在后面的代码中使用代码)自动绑定到我想要的视图?据我了解,如果正确完成,这就是模式应该如何工作。我可以使用主窗口 xaml 中的代码实现这一切,我甚至正确创建了一个资源字典(因为我可以在直接窗口中访问它)。

我有一个主窗口。这是一个有 3 行的网格。顶行是菜单。底行是状态栏。中间是一个堆栈面板,根据菜单选择动态加载内容。

我有 2 个视图用于填充此堆栈面板。一个只有一个样式文本框(帮助和关于)。另一个本身就是一个复合视图:一个搜索面板、一个结果网格和一个详细信息面板,所有这些都加载到停靠管理器框架中。

在后面的主窗口代码中,当用户单击菜单选项时,我清除堆栈面板的子项,实例化视图模型,实例化将视图模型传入其中的视图,然后将新视图添加到堆栈的子项中. 这很好用,但我认为它与模式不一致。

正如我提到的,我有资源字典,但我不知道如何将它与堆栈面板相关联。我假设我必须使用绑定,但我无法弄清楚如何绑定到资源字典和/或如何告诉它更改命令视图。

视图绑定模型方案

  1. 在 XAML 中创建静态资源。
<Window x:Class="WpfApplication2.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfApplication2"mc:Ignorable="d"Title="MainWindow" Height="350" Width="525"><Window.Resources><local:MainViewModel x:Key="MainVM" /></Window.Resources><Grid DataContext="{StaticResource MainVM}">
​</Grid>
</Window>

2.在View的构造函数中绑定

我知道你提到不使用背后的代码,但这也是一种选择。只要你不在后面的代码中写任何逻辑,那么你就很好。

public MainWindow()
{InitializeComponent();this.DataContext = new MainViewModel(); 
}
  1. 使用 ViewModelLocator 绑定

您可能想要创建一个视图模型定位器类,该类负责为您的视图提供所需的视图模型。

这是一个视图模型定位器类的简单示例。viewmodel 定位器类公开了一些 viewmodel 属性。稍后我们会将这些属性绑定到视图的数据上下文。

 public class ViewModelLocator{public ViewModelLocator(){this.MainVM = new MainViewModel();this.AnotherVM = new AnotherViewModel();}public MainViewModel MainVM { get; set; }public AnotherViewModel AnotherVM { get; set; }}

然后,您可以在 App.xaml 中创建视图模型定位器的静态资源,使其可用于应用程序中的所有视图。

<Application x:Class="WpfApplication2.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:WpfApplication2"StartupUri="MainWindow.xaml"><Application.Resources><local:ViewModelLocator x:Key="Locator" />         </Application.Resources>
</Application>

然后,您可以将视图的数据上下文绑定到视图模型定位器的属性。

该示例告诉我们,如果视图模型定位器(MainViewModel 实例)绑定到 Window 的数据上下文,则您正在将 MainVM 属性绑定。

<Window x:Class="WpfApplication2.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfApplication2"mc:Ignorable="d"Title="MainWindow" Height="350" Width="525"DataContext="{Binding MainVM, Source={StaticResource Locator}}">

视图模型双向数据绑定方案

1.简述

JS 几个流行的框架 Vuejs、Ember.js、AngularJS 都使用 MVVM 模式,该模式叫做视图模型双向数据绑定,以达到数据和视图快速同步的目的。本文就对其中涉及的原理部分加以说明(后续还有一篇模拟 实现)。主要体现就是表单元素值变,JS变量值改变,若页面上有输出,输出值也改变,典型的代码如下,vuejs.org 上提供的例子:

// HTML 
{{ message }}
// JS 8var app6 = new Vue({ 9 el: '#app',10 data: {11 message: 'Hello Vue!'12 }13})

效果:

文内容包括但不限于:

  • MVVM 数据双向绑定
  • DOM 事件监听
  • 数据劫持
  • 观察者模式

先从什么是 MVVM 说起。

2.MVVM,Model-View-ViewModel

MVVM 拆开来是 Model-View-ViewModel,View,ViewModel,Model 三部分组成,它是一种前端开发的架构模式。

View :代表的是视图,模版。它用来显示数据。 Model :代表的是模型、数据,可以在 Model 层中定义数据修改和操作的业务逻辑。 ViewModel :连接 Model 和 View。 如图所示:

在 MVVM 的架构下,View 层(DOM展示层)和 Model 层(数据对象层)并没有直接联系,而是通过 ViewModel 层进行交互。ViewModel 层通过双向数据绑定将 View 层和 Model 层连接了起来,使得 View 层和 Model 层的同步工作完全是自动的。

因此开发者只需关注业务逻辑,无需手动操作 DOM,复杂的数据状态维护交给 MVVM 统一来管理,称之为数据驱动的开发方法。

3 .双向数据绑定

就是指数据的传递有两个方向:

方向1:从数据到视图,数据变化时,视图也变化。 方向2:从视图到数据,例如 input 框的内容变化时,JS 维护的数据也会变化,同时再次传递到视图上,视图也随之变化。 若要实现以上的数据传递,我们需要去监听数据变化和视图的变化,才能做出相应改变。

4 .监听 DOM 改变

监听 DOM 视图的改变是为了更新模型。我们通过 DOM 事件就可以实现监听视图的改变,典型的 input 的 change、input 事件都可以完成监听,通过事件处理器,实现对应的模型的数据改变。

前面例子中的 input 元素的值的不断改变,就是 DOM 的改变,我们监听到之后,将模型变量 message 做同步更改!就是视图改变传递到了模型上。

那么为什么页面的展示也变了呢?就是下一个传递了。模型改变传递到视图上。数据的改变传递到视图上如何实现的呢?就是监听数据实现的。

5 .监听模型数据变化,数据劫持

如何做到 message 模型变量的变化我们可以监听到呢?其实是利用的 JS 中对象属性修改的特殊 get、set 方法实现的,示例代码如下:

var o = {};

// 创建一个新对象

// 在对象中添加一个属性与存取描述符的示例

var messageValue; 5Object.defineProperty(o, "message

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_77098.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux下nm,objdump和ldd三大工具使用

linux下进行C/C开发时经常需要使用nm&#xff0c;objdump&#xff0c;ldd工具来分析定位问题&#xff0c;本篇文章就对其做个总结&#xff1a; 1.测试程序 TestSo.h #pragma once #include <iostream>extern "C" int CTypeAdd(int x, int y); extern "…

Python 之网络式编程

一 客户端/服务器架构 即C/S架构&#xff0c;包括 1、硬件C/S架构&#xff08;打印机&#xff09; 2、软件B/S架构&#xff08;web服务&#xff09; C/S架构与Socket的关系&#xff1a; 我们学习Socket就是为了完成C/S的开发 二 OSI七层 引子&#xff1a;   计算机组成…

云HIS系统源码 医院his源码 云his源码

大型医院his系统源码 SaaS运维平台多医院入驻强大的电子病历完整文档 &#xff0c;有演示 一、系统概述&#xff1a; 基层卫生健康云是一款满足基层医疗机构各类业务需要的健康云产品。该产品能帮助基层医疗机构完成日常各类业务&#xff0c;提供病患挂号支持、病患问诊、电子…

python学习——【第一弹】

前言 Python是一种跨平台的计算机程序设计语言&#xff0c;是ABC语言的替代品&#xff0c;属于面向对象的动态类型语言&#xff0c;最初被设计用于编写自动化脚本&#xff0c;随着版本的不断更新和语言新功能的添加&#xff0c;越来越多被用于独立的、大型项目的开发。 从这篇…

轮盘赌选择法

轮盘赌选择原理 轮盘赌选择法&#xff08;roulette wheel selection&#xff09;是最简单也是最常用的选择方法&#xff0c;在该方法中&#xff0c;各个个体的选择概率和其适应度值成比例&#xff0c;适应度越大&#xff0c;选中概率也越大。 从图中可以看出一等奖、二等奖、…

【Java集合框架】篇六:Collections工具类

Collections 是一个操作 Set、List 和 Map 等集合的工具类。 1。 常用方法 Collections 中提供了一系列静态的方法对集合元素进行排序、查询和修改等操作&#xff0c;还提供了对集合对象设置不可变、对集合对象实现同步控制等方法&#xff08;均为static方法&#xff09;&…

【Python学习笔记】第二十六节 Python PyMySQL

一、什么是 PyMySQL&#xff1f;PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库。可以用它来连接Python和MySQL。如果你追求速度&#xff0c;这是一个很好的选择&#xff0c;因为它比mysql-connector-python快。PyMySQL 遵循 Python 数据库 API v2.0 规范&#x…

AntDB“超融合+流式实时数仓”,谈传统数据库与流计算的有机融合

&#xff08;一&#xff09; 前言 据统计&#xff0c;在信息化时代的今天&#xff0c;人们一天所接触到的信息量&#xff0c;是古人一辈子所能接收到的信息量的总和。当今社会中除了信息量“多”以外&#xff0c;人们对信息处理的“效率”和“速度”的要求也越来越高。譬如&am…

浅谈一下mysql8.0与5.7的字符集

修改字符集 修改步骤 在MySQL8.0版本之前&#xff0c;默认字符集为1atin1,utf8字符集指向的是utf8mb3。网站开发人员在数据库设计的时候往往会将编码修改为ut8字符集。如果遗忘修改默认的编码&#xff0c;就会出现乱码的问题。从MySQL8.0开始&#xff0c;数据库的默认编码将改…

王道C语言督学营OJ练习全解【24考研最新版】

前言 本篇博客是在博主参加王道408专业课前置课程-----C语言督学营的学习笔记&#xff0c;包含了从第一节课到最后一节课的所有OJ习题题解&#xff0c;文章中每一题都给出了详尽的代码&#xff0c;并在每一题的关键部位加上了注释&#xff0c;记录下来的目的是方便自己以后进行…

maven镜像源及代理配置

在公司使用网络一般需要设置代理&#xff0c; 我在idea中创建springboot工程时&#xff0c;发现依赖下载不了&#xff0c;原以为只要浏览器设置代理&#xff0c;其他的网络访问都会走代理&#xff0c;经过查资料设置了以下几个地方后工程创建正常&#xff0c;在此记录给大家参考…

Python中Opencv和PIL.Image读取图片的差异对比

近日&#xff0c;在进行深度学习进行推理的时候&#xff0c;发现不管怎么样都得不出正确的结果&#xff0c;再仔细和正确的代码进行对比了后发现原来是Python中不同的库读取的图片数组是有差异的。 image np.array(Image.open(image_file).convert(RGB)) image cv2.imread(…

SpringBoot实现Excel导入导出,简单好用

EasyPoi简介 POI是Java操作MicroOffice&#xff08;如对Excel的导入导出&#xff09;的一个插件。POI的全称是&#xff08;Poor Obfuscation Implementation&#xff09;&#xff0c;POI官网地址是 http://poi.achache.org/index.html 。 EasyPoi对POI进行了优化&#xff0c;…

Navicat 现已支持 OceanBase 全线数据库产品

Navicat 作为 OceanBase 生态工具的合作伙伴&#xff0c;这是双方产品适配第三个里程碑。2022 年 7 月的首个里程碑&#xff0c;Navicat 实现了 OceanBase 社区版的功能性兼容。同年10 月&#xff0c;进一步实现了针对 OceanBase 企业版&#xff08; 兼容 MySQL 模式&#xff0…

嵌入式学习笔记——STM32单片机开发前的准备

STM32单片机开发前的准备1.集成开发环境的选取STM32 CubeIDEKEIL_MDK2.KEIL_MDK环境搭建安装包获取及安装芯片包下载及安装工程建立(STM32F407VET6为例)1.新建工程文件夹2.新建工程3.安装ST-LINK以及CH340的驱动4.设置KEIL&#xff0c;并烧录本文重点1.集成开发环境的选取 前面…

使用Containerd搭建K8s集群【v1.25】

[toc] 一、安装要求 在开始之前,部署Kubernetes集群机器需要满足以下几个条件: 一台或多台机器,操作系统 CentOS7.x-86_x64硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多集群中所有机器之间网络互通可以访问外网,需要拉取镜像禁止swap分区二、准备环境 角色IP…

权限管理系统设计——入门(一)

权限管理系统设计——入门&#xff08;一&#xff09; 后续更新中… 概念 1、身份认证&#xff1a;用户是否是合法。 2、限制资源访问&#xff1a;根据系统设置的安全规则或者安全策略&#xff0c;用户可以访问而且只能访问自己被授权的资源。 3、用途广&#xff1a;出现在任何…

MySQL中varchar(M)存储字符串过长

最近写项目&#xff0c;数据库报了一个错&#xff0c;错误原因是MySQL中存储的字符串过长最近在学MySQL的基础&#xff0c;刚好学到了关于varchar类型要存储的字符串是 “<p>12121212121212</p>\n<p><img src\"https://zzjzzjzzjbucket.oss-cn-hangz…

【markdown】markdown语法

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

【iobit 软件】家族系列 - 正版激活码

装机必备iobit系列软件 - 激活码获取看最后 第一款、Advanced SystemCare 16 您需要的人工智能驱动的PC优化器&#xff0c;以释放磁盘空间&#xff0c;加速PC并保护在线隐私。 功能特点&#xff1a; 1. 系统清理与优化&#xff1a;通过清除系统垃圾文件、注册表信息、无用文…