MVVM是Model-View-ViewModel的缩写。mvvm是一种设计思想。Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑;View 代表UI 组件,它负责将数据模型转化成UI展现出来,ViewModel是一个同步View和Model的对象。
在MVVM架构下,View和Model之间没有直接的联系,它们通过ViewModel进行交互,Model和ViewModel之间是交互是双向的,因此,View和Model的数据变化可以是同步的。
MVVM模式下的应用分层
Models:存放数据模型,可以是程序集或文件夹。
Views:存放WPF中的Window、Page、UserControl等一些界面可视化的文件,可以是程序集或文件夹。
ViewModels:业务逻辑层,可以是程序集或文件夹。
这里只是简单的做一下MVVM模式下各个层次双向绑定数据处理的实例。其他还包括依赖属性、数据校验、等等在前面的章节中有详细说明,就不再这里重述了。
Model层
如果数据模型层的模型中有很多需要进行数据变化通知处理的话,可以借用第三方库PropertyChanged.Fody来减少工作量。
public class MainModel:INotifyPropertyChanged
{
private double value1 = 12;
public double Value1 {
get { return value1; }
set {
value1 = value;
Value3 = value1 + value2;
}
}
private double value2 = 32;
public double Value2
{
get { return value2; }
set
{
value2 = value;
Value3 = value1 + value2;
}
}
private double value3;
public event PropertyChangedEventHandler PropertyChanged;
public double Value3 {
get { return value3; }
set {
value3 = value;
//通知xmal中绑定了此类型实例的Value3属性的对象,这个属性变化了,请重新取一下值
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Value3"));
}
}
}
ViewModel层
public class MainViewModel
{
public MainModel mainModel { get; set; } = new MainModel();
}
View层
<Window ......
xmlns:vm="clr-namespace:WpfApp8.ViewModels"
......>
<Window.DataContext>
<vm:MainViewModel/>
</Window.DataContext>
<Grid>
<StackPanel>
<TextBox Text="{Binding mainModel.Value1, UpdateSourceTrigger=PropertyChanged}"/>
<Slider Value="{Binding mainModel.Value2}" Maximum="100" Minimum="0"/>
<TextBlock Text="{Binding mainModel.Value3}"/>
</StackPanel>
</Grid>
</Window>