prism框架_NET Core 3 WPF MVVM框架 Prism系列之数据绑定

一.安装Prism

1.使用程序包管理控制台#

Install-Package Prism.Unity -Version 7.2.0.1367

也可以去掉‘-Version 7.2.0.1367’获取最新的版本

2.使用管理解决方案的Nuget包#

2f5bf4561cb7d8335cd746f05b013b56.png


在上面或许我们有个疑问?为啥安装prism会跟Prism.Unity有关系,我们知道Unity是个IOC容器,而Prism本身就支持IOC,且目前官方支持几种IOC容器:

d29df03c8657a6eb776690de88b85414.png


1.且unity由于是微软官方的,且支持prism的组件化,由此我推荐使用prism.unity,在官方文档中prism7不支持prism.Mef,Prism 7.1将不支持prism.Autofac2.安装完prism.unity就已经包含着所有prism的核心库了,架构如下:

c38f2f02003c2b3a66e45e612672e1ce.png

二.实现数据绑定

我们先创建Views文件夹和ViewModels文件夹,将MainWindow放在Views文件夹下,再在ViewModels文件夹下面创建MainWindowViewModel类,如下:

147f54668dabcfd9b9d7a8d562168f32.png


xmal代码如下:

3a66c91b39e586af270c13abb0f904d5.gif
    
3a66c91b39e586af270c13abb0f904d5.gif

ViewModel代码如下:

3a66c91b39e586af270c13abb0f904d5.gif
using Prism.Commands;using Prism.Mvvm;namespace PrismSample.ViewModels{   public class MainWindowViewModel:BindableBase    {        private string _text;        public string Text        {            get { return _text; }            set { SetProperty(ref _text, value); }        }        private DelegateCommand _clickCommnd;        public DelegateCommand ClickCommnd =>            _clickCommnd ?? (_clickCommnd = new DelegateCommand(ExecuteClickCommnd));        void ExecuteClickCommnd()        {            this.Text = "Click Me!";        }        public MainWindowViewModel()        {            this.Text = "Hello Prism!";        }    }}
3a66c91b39e586af270c13abb0f904d5.gif

启动程序:

696d2c749bc4bae938679fbff99a90ea.png


点击 click Me 按钮:

9cda7b932bf40e3ae8c19d07bcfdc56a.png

可以看到,我们已经成功的用prism实现数据绑定了,且View和ViewModel完美的前后端分离

但是现在我们又引出了另外一个问题,当我们不想按照prism的规定硬要将View和ViewModel放在Views和ViewModels里面,又或许自己的项目取名规则各不相同怎么办,这时候就要用到另外几种方法:

1.更改命名规则#


如果,公司命名规则很变态,导致项目结构变成这样(这种公司辞职了算了):

e09739c5a3c00d77ebb647ad9d4a9e99.png


首先我们在App需要引入prism,修改‘Application’为‘prism:PrismApplication’且删除StartupUrixmal代码如下:

3a66c91b39e586af270c13abb0f904d5.gif
3a66c91b39e586af270c13abb0f904d5.gif

cs后台代码如下:

3a66c91b39e586af270c13abb0f904d5.gif
using Prism.Unity;using Prism.Ioc;using Prism.Mvvm;using System.Windows;using PrismSample.Viewsb;using System;using System.Reflection;namespace PrismSample{    ///     /// Interaction logic for App.xaml    ///     public partial class App : PrismApplication    {        //设置启动起始页        protected override Window CreateShell()        {            return Container.Resolve();        }        protected override void RegisterTypes(IContainerRegistry containerRegistry)        {        }        //配置规则        protected override void ConfigureViewModelLocator()        {            base.ConfigureViewModelLocator();            ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) =>            {                var viewName = viewType.FullName.Replace(".Viewsb.", ".ViewModelsa.OhMyGod.");                var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName;                var viewModelName = $"{viewName}Test, {viewAssemblyName}";                return Type.GetType(viewModelName);            });        }    }}
3a66c91b39e586af270c13abb0f904d5.gif

上面这两句是关键:


".Viewsb." 表示View所在文件夹namespace,".ViewModelsa.OhMyGod." 表示ViewModel所在namespace1var viewName = viewType.FullName.Replace(".Viewsb.", ".ViewModelsa.OhMyGod.");

Test表示ViewModel后缀

var viewModelName = $"{viewName}Test, {viewAssemblyName}";

2.自定义ViewModel注册#


我们新建一个Foo类作为自定义类,代码如下:

3a66c91b39e586af270c13abb0f904d5.gif
using Prism.Commands;using Prism.Mvvm;namespace PrismSample{   public class Foo:BindableBase    {        private string _text;        public string Text        {            get { return _text; }            set { SetProperty(ref _text, value); }        }        public Foo()        {            this.Text = "Foo";        }        private DelegateCommand _clickCommnd;        public DelegateCommand ClickCommnd =>            _clickCommnd ?? (_clickCommnd = new DelegateCommand(ExecuteClickCommnd));        void ExecuteClickCommnd()        {            this.Text = "Oh My God!";        }    }}
3a66c91b39e586af270c13abb0f904d5.gif


修改App.cs代码:

3a66c91b39e586af270c13abb0f904d5.gif
protected override void ConfigureViewModelLocator()        {            base.ConfigureViewModelLocator();            ViewModelLocationProvider.Register();            //ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver((viewType) =>            //{            //    var viewName = viewType.FullName.Replace(".Viewsb.", ".ViewModelsa.OhMyGod.");            //    var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName;            //    var viewModelName = $"{viewName}Test, {viewAssemblyName}";            //    return Type.GetType(viewModelName);            //});        }
3a66c91b39e586af270c13abb0f904d5.gif

运行:

7b45c4240db1780b03c86b50f91bded6.png

点击按钮:

8d816876c4dd4f54f4d194eb41a6cee8.png

就算是不注释修改命名规则的代码,我们发现运行结果还是一样,因此我们可以得出结论,

这种直接的,不通过反射注册的自定义注册方式优先级会高点,在官方文档也说明这种方式效率会高点

且官方提供4种方式,其余三种的注册方式如下:

ViewModelLocationProvider.Register(typeof(MainWindow).ToString(), typeof(MainWindowTest)); 
ViewModelLocationProvider.Register(typeof(MainWindow).ToString(), () => Container.Resolve());
ViewModelLocationProvider.Register(() => Container.Resolve());

作者: RyzenAdorer

出处:https://www.cnblogs.com/ryzen/p/11905866.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值