基础概念
- MVVM:设计模式,用于构建WPF应用程序。
- 数据绑定:将View的UI元素与ViewModel中的数据属性进行关联。
- Model为应用程序的数据,View是用户界面,而ViewModel则是View和Model之间的中介。
- 数据绑定优势:数据发生变化时,数据绑定会自动更新UI。
- 数据绑定将UI与逻辑分离,助于提高应用程序的可维护性和可扩展性。
数据绑定类型
单向绑定 (One-Way Binding) | 源到目标: 当源属性发生变化时,目标属性会自动更新,但反之则不会。这是最常用的绑定类型。 | 语法示例:{Binding Path=SourceProperty, Mode=OneWay} |
双向绑定 (Two-Way Binding): | 源到目标和目标到源: 当任一端的属性发生变化时,另一端也会自动更新。常用于表单输入控件。 | 语法示例:{Binding Path=SourceProperty, Mode=TwoWay} |
单向到源绑定 (OneWayToSource): | 目标到源: 与单向绑定相反,当目标属性发生变化时,源属性会更新,但源属性变化不会影响目标。 | 语法示例:{Binding Path=SourceProperty, Mode=OneWayToSource} |
一次性绑定 (OneTime Binding): | 只在初始化时绑定: 数据绑定只在第一次加载时发生一次,之后不再更新。 | 语法示例:{Binding Path=SourceProperty, Mode=OneTime} |
默认绑定: | 如果未指定绑定模式,WPF将根据上下文自动选择。例如,对于TextBox 控件,默认是双向绑定;对于Label 控件,默认是单向绑定。 |
适用场景
- 单向绑定适用于数据只读显示,不需要用户交互的场景。
- 双向绑定适用于用户输入需要实时反馈到数据模型的情况。
- 单向到源绑定适用于需要从UI更新数据模型,但不需要将模型更新反映回UI的情况。
- 一次性绑定适用于性能敏感的应用,其中不需要随时间更新数据。
MVVM数据绑定demo:
步骤:
- 创建wpf项目。
- 创建M,V,VM三个层次文件夹。
- 创建person类,创建personViewModel类,创建viewxaml文件。
- 置于对应文件夹。
- 在view的后台C#代码进行数据绑定。
- 运行。
步骤2. | 步骤4. |
步骤6. | 步骤6. |
步骤3. person类
public class Person : INotifyPropertyChanged
{
private string name;
private int age;
public string Name
{
get { return name; }
set
{
name = value;
OnPropertyChanged(nameof(Name));
}
}
public int Age
{
get { return age; }
set
{
age = value;
OnPropertyChanged(nameof(Age));
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
步骤3. PersonViewModel类
public class PersonViewModel : INotifyPropertyChanged
{
private Person person;
public PersonViewModel()
{
person = new Person { Name = "张三", Age = 30 };
}
public string Name
{
get { return person.Name; }
set
{
person.Name = value;
OnPropertyChanged(nameof(Name));
}
}
public int Age
{
get { return person.Age; }
set
{
person.Age = value;
OnPropertyChanged(nameof(Age));
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
步骤3. 创建viewXAML文件
<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 示例" Height="200" Width="300">
<Grid>
<StackPanel>
<TextBox Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" Margin="10"/>
<TextBox Text="{Binding Age, UpdateSourceTrigger=PropertyChanged, StringFormat='{}{0}岁'}" Margin="10"/>
</StackPanel>
</Grid>
</Window>
步骤5. view的后台代码
InitializeComponent();
this.DataContext = new PersonViewModel();
此处使用单向数据绑定(One-Way Binding),文本框的
Text
属性被绑定到PersonViewModel
的Name
和Age
属性。当PersonViewModel
的Name
或Age
属性发生变化时,这些变化会自动反映到UI上,更新文本框的内容。相反,文本框中的更改不会自动回传给PersonViewModel
的属性,除非指定了UpdateSourceTrigger
。