MVVM(使用Prism框架)开发WPF

摘要:
目的是分离视图和模型的耦合-解耦1.视图负责前端显示,并在数据和命令中与ViewModel交互。事实上,我个人认为数据和业务交互层应该是独立的。该模型完全是一个实体模型,这更加清晰。建议使用移动热点下载。在VS2017及以上版本中,扩展-管理扩展,在线搜索PrismTemplatePack并安装它。也可以在线下载https://marketplace.visualstudio.com/items?

【MVVM】目的是为了分离视图(View)和模型(Model)的耦合——解耦

1、View负责前端展示,与ViewModel进行数据和命令的交互。(双向的数据属性传递,单向的命令属性传递View→ViewModel
2、ViewModel,负责前端视图业务级别的逻辑结构组织,并将其反馈给前端。
3、Model,主要负责数据实体的结构处理,与ViewModel进行交互。
其实我个人认为,数据和业务交互这一层还是应该另外独立,Model中完全就是实体模型,这样更清晰。

【安装Prism模板框架】建议用手机热点下载。也可以在VS的NuGet中搜索,但是每建一个项目就需要搜索引用一次,麻烦。

VS2017及以上版本中,拓展—管理拓展(或工具—拓展和更新),联机,搜索Prism Template Pack,安装即可。(推荐此安装方式)

也可以网上下载https://marketplace.visualstudio.com/items?itemName=BrianLagunas.PrismTemplatePack

新建项目界面出现下图,安装成功。

MVVM(使用Prism框架)开发WPF第1张

【实战】像学高中物理受力分析一样,先分析界面有多少数据属性、命令属性

MVVM(使用Prism框架)开发WPF第2张 MVVM(使用Prism框架)开发WPF第3张

新建Prsm Blank App(WPF) 项目:Demo MVVM

Views中MainWindow.xaml代码:

<Window x:Class="DemoMVVM.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
        Title="{Binding Title}" Height="200" Width="300">
    <StackPanel>
            <TextBox Text="{Binding Input1}" Margin="5,20,5,5" Width="100"/>
            <TextBox Text="{Binding Input2}" Margin="5" Width="100"/>
            <Button Command="{Binding AddCommand}" Content="求和" Width="75" Margin="5"/>
            <TextBox Text="{Binding Result}" Margin="5" Width="100"/>
        </StackPanel>
</Window>

ViewModels中MainWindowViewModel.cs代码:其他文件代码不动

using Prism.Mvvm;
using Prism.Commands; //引入命令
using System;

//ViewModel为View提供数据属性、命令属性
namespace DemoMVVM.ViewModels
{
    public class MainWindowViewModel : BindableBase
    {
        #region 私有变量,以及对应的属性(习惯大写)
        private string _title = "Prism Application";
        private double _input1; //默认0
        private double _input2;
        private double _result;
        public double Result //数据属性
        {
            get { return _result; }
            set { _result = value; RaisePropertyChanged("Result"); } //变化结果展示在View界面上
        }
        public double Input2 //数据属性
        {
            get { return _input2; }
            set { _input2 = value; }
        }
        public double Input1 //数据属性
        {
            get { return _input1; }
            set { _input1 = value; }
        }
        public string Title //数据属性
        {
            get { return _title; }
            set { _title = value; }
        }
        #endregion
        #region 命令属性
        public DelegateCommand AddCommand { get; set; }
        #endregion
        public void Add() //方法
        {
            this.Result = this.Input1 + this.Input2;
        }

        public MainWindowViewModel() //将方法Add与命令属性AddCommand联系起来
        {
            this.AddCommand = new DelegateCommand(new Action(Add));         
        }
    }
}

注意:View与ModelView传递的是属性、属性、属性(习惯大写)

 【实战2】

MVVM(使用Prism框架)开发WPF第4张 MVVM(使用Prism框架)开发WPF第5张

新建Prsm Blank App(WPF) 项目:BlankApp5

Views中MainWindow.xaml代码:

<Window x:Class="BlankApp5.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
        Title="{Binding Title}" Height="200" Width="300">

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="0" Orientation="Horizontal" VerticalAlignment="Center">
            <TextBlock Text="学号" Margin="20,0" VerticalAlignment="Center"/>
            <TextBox Text="{Binding Id}" IsReadOnly="True" Width="200" Padding="2" />
        </StackPanel>
        <StackPanel Grid.Row="1" Orientation="Horizontal" VerticalAlignment="Center">
            <TextBlock Text="姓名" Margin="20,0" VerticalAlignment="Center"/>
            <TextBox Text="{Binding Name}" IsReadOnly="True" Width="200" Padding="2"/>
        </StackPanel>
        <Button Command="{Binding ShowCommand}" Content="显示" Grid.Row="2" VerticalAlignment="Center" Width="50"/>
    </Grid>
</Window>

ViewModels中MainWindowViewModel.cs代码:其他文件代码不动

using Prism.Mvvm;
using Prism.Commands;
using System;

namespace BlankApp5.ViewModels
{
    public class MainWindowViewModel : BindableBase
    {
        #region 私有变量,以及对应的属性(习惯大写)
        private string _title = "Prism Application";
        private string _name;
        private string _id;
        public string Id
        {
            get { return _id; }
            set { _id = value; RaisePropertyChanged("Id"); }
        }
        public string Name
        {
            get { return _name; }
            set { _name = value; RaisePropertyChanged("Name"); }
        }
        public string Title
        {
            get { return _title; }
            set { _title=value; }
        }
        #endregion
        #region 命令属性
        public DelegateCommand ShowCommand { get; set; }
        #endregion
        public void Show() //方法
        {
            this.Name = "夕西行";
            this.Id = "20190809";
        }
        public MainWindowViewModel() //命令属性与方法联系起来
        {
            this.ShowCommand = new DelegateCommand(new Action(Show));
        }
    }
}

MainWindow.xaml.cs代码:贴出来只是有疑问,大神可解答下

using System.Windows;
using BlankApp5.ViewModels;

namespace BlankApp5.Views
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            //this.DataContext = new MainWindowViewModel(); //这句有无貌似没什么影响,懂得大神可以留言讲下
        }
    }
}

免责声明:文章转载自《MVVM(使用Prism框架)开发WPF》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇halcon算子sqlserver 新建只读权限用户下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Wpf杀死所有线程、Wpf关闭程序杀死所有线程

Wpf关闭程序杀死所有线程: Process.GetCurrentProcess().Kill(); using System.Diagnostics; private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e) { Process.Get...

WPF 饼状图,柱形图,折线图 (2 折线图)

折线图在柱形图的基础上,做了一些修改。大概效果和用法如下。 X轴和Y轴的刻度,使用用了Path的Figures属性,绘制多条Figure+LineSegment完成。  同时,由于折线图很可能会画多条线。所以对Itemsource的数据结构会有一些要求。要手工做一下分组等操作。 实际使用时,我没法保证Itemsource传进来的值中,陈傻傻和周笨笨条数一...

WPF读写config配置文件

WPF读写config配置文件单。 1. 在你的工程中,添加app.config文件。文件的内容默认为: 1 <?xml version="1.0" encoding="utf-8" ?> 2 <configuration> 3 </configuration> 2.如果你想给程序配置一些参数,就在<c...

wpf 中设置DataGridTextColumn的文本对齐方式

DataGrid里面存在着像DataGridColumnHeader、DataGrid、DataGridCell等相关控件的样式设置,例如让一个DataGrid里面某一列的控件内容居中显示,例如: DataGridColumnHeader View Code <Style x:Key="ColumnHeaderStyle" TargetType="{...

WPF 中托管 UWP

托管标准 UWP 控件 1. 新建空白应用(通用 Windows)项目,确保目标版本和最低版本均设置为 Windows 10 版本 1903 或更高版本。在 UWP 应用项目中,安装Microsoft.Toolkit.Win32.UI.XamlApplication 2. 修改App的默认基类为XamlApplication <xaml:XamlAp...

MVC和MVVM

提到MVC,编程的人都会知道,我说的多了,就变成了啰嗦,MVC这个名词,是在大三的时候接触,但是没用过,当时我是以看书为主,很少动手,大四实习的时候,项目经理安排一个程序,让我按照MVC的方式去写,因为当时我是给已有的系统扩充功能,公司的系统有自己的框架,我只是照猫画虎,并没在意,功能实现了,就草草了事。 工作了,自己回头看以前写的代码,惨不忍睹,一个类中...