MVVM
MVVM(Model-View-ViewModel)模式详细介绍
MVVM(Model-View-ViewModel)是一种常见的软件架构模式,尤其在桌面应用和前端开发中有广泛应用。它的核心目标是实现“关注点分离”,通过将应用的逻辑与用户界面分开,使得应用更加模块化、可维护且易于测试。
MVVM的基本结构
MVVM模式有三个主要部分:
1. Model(模型)
- 代表应用的核心数据和业务逻辑。它与应用的业务需求和数据结构直接相关。
- Model不关心视图(View)的实现,它只负责提供数据和处理业务逻辑。
2. View(视图)
- 负责用户界面的呈现,通常是应用中的窗口、按钮、文本框等界面元素。
- View只关心如何展示数据,不包含业务逻辑。
3. ViewModel(视图模型)
- 是View和Model之间的桥梁,充当中介的角色。它从Model中获取数据,并处理后传递给View进行展示。
- ViewModel负责对用户界面逻辑(例如UI的状态控制、数据格式化等)进行封装,同时不直接操作视图。
- ViewModel和View通过数据绑定(Data Binding)进行通信。
MVVM的工作原理
-
数据绑定(Data Binding):
MVVM的一个关键特性就是数据绑定。View与ViewModel之间的通信通过绑定机制实现。当ViewModel中的数据变化时,View会自动更新显示,反之亦然。这样,开发者可以避免直接在代码中修改视图,只需更新ViewModel中的数据即可自动反映到视图。 -
命令(Commands):
在MVVM中,ViewModel通常会提供命令(例如按钮点击时触发的操作)来响应用户的交互行为。命令在ViewModel中定义,View通过绑定到相应的命令来触发交互,而不直接操作UI控件。
WPF中的MVVM
WPF(Windows Presentation Foundation)是微软的一种桌面应用开发框架,它天然支持MVVM模式。WPF的优势之一是强大的数据绑定机制,它可以通过绑定将UI与ViewModel中的属性和命令直接关联。
在WPF中如何实现MVVM:
- Model:表示应用的数据对象,通常为POCO类(Plain Old CLR Object),不包含UI逻辑。
- View:XAML文件中的界面定义。WPF提供了强大的数据绑定和事件命令机制,View通常与ViewModel进行绑定。
- ViewModel:包含与View相关的所有逻辑,通常继承自
INotifyPropertyChanged
接口,这样View就能监听数据变化并自动更新。
WPF MVVM 示例代码
// Model
public class Person
{
public string Name { get; set; }
public int Age { get; set; }
}
// ViewModel
public class PersonViewModel : INotifyPropertyChanged
{
private Person _person;
public Person Person
{
get { return _person; }
set { _person = value; OnPropertyChanged(); }
}
public PersonViewModel()
{
Person = new Person() { Name = "John", Age = 30 };
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
<Window x:Class="MVVMExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MVVM Example" Height="350" Width="525">
<Grid>
<TextBlock Text="{Binding Person.Name}" />
<TextBlock Text="{Binding Person.Age}" />
</Grid>
</Window>
在这个例子中,ViewModel负责将数据传递给View,而View通过数据绑定自动更新。
此外WPF还有几种绑定数据更新的形式
- OneWay(单向绑定)
-
描述:数据从源(ViewModel)流向目标(View),即当ViewModel中的数据发生变化时,View会自动更新,但反之不会。
-
使用场景:适用于不需要用户直接修改数据的情况,典型如标签显示的文本。
例子:
<TextBlock Text="{Binding Name, Mode=OneWay}" />
当Name属性在ViewModel中发生变化时,TextBlock会自动更新其显示内容。
- TwoWay(双向绑定)
-
描述:数据源和目标之间相互绑定,视图和视图模型的内容互相更新。当用户在UI中修改控件的内容时,数据源会自动更新;同时,如果数据源发生变化,UI也会相应更新。
-
使用场景:适用于用户可以修改数据的场景,如文本框、复选框等。
例子:
<TextBox Text="{Binding Name, Mode=TwoWay}" />
在这个例子中,TextBox的内容与Name属性双向绑定。当用户在TextBox中输入内容时,Name属性会自动更新。同时,如果Name发生变化,TextBox的显示内容也会自动更新。
- OneWayToSource(单向到源)
-
描述:与OneWay相反,数据只从目标流向源,即数据的变化会从UI控件传递到数据源,但数据源的变化不会影响到UI。
-
使用场景:适用于仅仅需要将UI输入值传递回数据源的情况,通常用于特定的表单或验证场景。
例子:
<TextBox Text="{Binding Name, Mode=OneWayToSource}" />
在此例中,当用户在TextBox中输入文本时,Name属性会更新,但Name属性的变化不会影响到TextBox。
- OneTime(一次绑定)
-
描述:数据绑定只发生一次,在绑定时将数据源的值传递给目标控件,之后数据源变化不会影响目标控件。这个绑定模式通常用于静态数据或加载一次性数据的场景。
-
使用场景:适用于不需要后续更新的场景,如窗口的初始化数据。
例子:
<TextBlock Text="{Binding Name, Mode=OneTime}" />
TextBlock会显示Name的初始值,但如果Name发生变化,TextBlock不会更新。
- Default(默认绑定)
- 描述:如果没有显式指定绑定模式,WPF会使用默认的绑定模式。在大多数情况下,WPF默认的绑定模式是OneWay,即只有数据源变化时视图会更新,反之不会。
例子:
<TextBlock Text="{Binding Name}" />
这等同于Mode=OneWay,因此TextBlock会自动更新显示Name的值,但不会反过来更新Name。
- Binding with UpdateSourceTrigger
-
描述:在双向绑定中,UpdateSourceTrigger定义了何时将目标控件的值更新到数据源。常用的触发方式有PropertyChanged(每次控件内容变化时更新数据源)和LostFocus(控件失去焦点时更新数据源)。
-
使用场景:通常用在表单、用户输入的实时数据传输时。
例子:
<TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" />
在此示例中,TextBox每当内容发生变化时就会更新Name属性。如果不指定UpdateSourceTrigger,默认值是LostFocus,即只有TextBox失去焦点时,数据源才会更新。
- Binding with Converter(使用值转换器)
-
描述:使用数据转换器(IValueConverter)来在数据绑定过程中对数据进行转换。转换器允许在数据从源到目标(或反向)传递时进行处理。
-
使用场景:适用于需要对数据进行格式化、条件处理等转换的场景。
例子:
<TextBlock Text="{Binding Age, Converter={StaticResource AgeToStringConverter}}" />
这里,AgeToStringConverter是一个实现了IValueConverter接口的转换器,用来将Age属性转换为字符串显示。
Vue中的MVVM
Vue.js是一个用于构建用户界面的前端框架,其本质上也采用了MVVM架构。Vue将View和ViewModel结合得非常紧密,允许开发者以声明式的方式绑定数据和UI。Vue通过v-bind、v-model和v-on等指令,使得View和ViewModel之间的交互非常直观。
在Vue中如何实现MVVM:
- Model:Vue的Model通常就是应用的数据(即Vue实例的数据)。
- View:HTML模板,Vue通过模板语法来绑定数据和视图。
- ViewModel:Vue实例本身,即new Vue()的对象,包含所有的逻辑和数据。
Vue MVVM 示例代码
<!DOCTYPE html>
<html>
<head>
<title>Vue MVVM Example</title>
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head>
<body>
<div id="app">
<p>{{ person.name }}</p >
<p>{{ person.age }}</p >
</div>
<script>
new Vue({
el: '#app',
data: {
person: {
name: 'John',
age: 30
}
}
});
</script>
</body>
</html>
在这个Vue示例中,person数据就是Model,#app中的HTML模板是View,Vue实例本身则是ViewModel,它负责管理数据并更新视图。
WPF与Vue中的MVVM对比
- 绑定机制:
- WPF:使用强大的数据绑定机制,支持一对多的数据绑定,能够响应属性的变化(通过INotifyPropertyChanged)。
- Vue:同样也支持数据绑定(通过双向绑定v-model)以及计算属性和侦听器,响应式系统使得数据变化自动反映到视图。
- 实现难度:
- WPF:需要掌握XAML和C#的结合,通常对新手来说有一定的学习曲线。
- Vue:更为简洁和直观,尤其对于前端开发者,Vue的MVVM实现相对容易上手。
- 适用场景:
- WPF:主要用于Windows桌面应用开发,适合需要丰富UI和复杂业务逻辑的应用。
- Vue:主要用于Web开发,适合单页面应用(SPA),轻量且灵活。
总结
MVVM模式的核心思想是通过分离视图、视图模型和模型,使得应用的逻辑更加清晰、可维护。在WPF中,MVVM模式得到了全面支持,通过强大的数据绑定机制和命令模型,开发者能够更加专注于业务逻辑的开发;在Vue中,MVVM模式则通过响应式数据绑定和Vue实例的管理,使得开发Web应用变得更加高效和灵活。
本文来自博客园,作者:余生不晚,转载请注明原文链接:https://www.cnblogs.com/daylan/p/18563073
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 提示词工程——AI应用必不可少的技术
· 地球OL攻略 —— 某应届生求职总结
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界