1. Prism系列之数据绑定

Prism系列之数据绑定


文章目录


一、安装Prism

  1. 创建一个WPF工程,创建名为 PrismNewSample 的WPF项目。

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

在上面或许我们有个疑问?

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

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

二、实现数据绑定

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

xaml代码如下:

xml 复制代码
<Window x:Class="PrismNewSample.Views.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:PrismNewSample.Views"
        xmlns:prism="http://prismlibrary.com/"
        prism:ViewModelLocator.AutoWireViewModel="True"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <StackPanel>
        <TextBox Text="{Binding Text}" Margin="10" Height="100" FontSize="50" Foreground="Black" BorderBrush="Black"/>
        <Button  Height="100" Width="300" Content="Click Me" FontSize="50" Command="{Binding ClickCommnd}"/>
    </StackPanel>
</Window>

ViewModel代码如下:

csharp 复制代码
using Prism.Commands;
using Prism.Mvvm;

namespace PrismNewSample.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!";
        }
    }
}

首先我们在App需要引入prism,修改Applicationprism:PrismApplication且删除StartupUri

App.xaml

xml 复制代码
<prism:PrismApplication  
    xmlns:prism="http://prismlibrary.com/" 
                        x:Class="PrismNewSample.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:PrismNewSample">
    <Application.Resources>

    </Application.Resources>
</prism:PrismApplication>

App.xaml.cs

csharp 复制代码
using Prism.Ioc;
using Prism.Mvvm;
using Prism.Unity;
using PrismNewSample.ViewModels;
using PrismNewSample.Views;
using System.Windows;
namespace PrismNewSample
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : PrismApplication
    {
        //设置启动起始页
        protected override Window CreateShell()
        {
            return Container.Resolve<MainWindow>();
        }

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {

        }

        //配置规则
        protected override void ConfigureViewModelLocator()
        {
            base.ConfigureViewModelLocator();
            ViewModelLocationProvider.Register<MainWindow, MainWindowViewModel>();
        }
    }
}

启动程序:

点击按钮:

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

三、更换数据源

新建一个Foo类作为自定义类

csharp 复制代码
using Prism.Commands;
using Prism.Mvvm;

namespace PrismNewSample.ViewModels
{
    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 = "I'm Foo!";
        }
    }
}

App.xaml.cs

csharp 复制代码
using Prism.Ioc;
using Prism.Mvvm;
using Prism.Unity;
using PrismNewSample.ViewModels;
using PrismNewSample.Views;
using System.Windows;
namespace PrismNewSample
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : PrismApplication
    {
        //设置启动起始页
        protected override Window CreateShell()
        {
            return Container.Resolve<MainWindow>();
        }

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {

        }

        //配置规则
        protected override void ConfigureViewModelLocator()
        {
            base.ConfigureViewModelLocator();
            ViewModelLocationProvider.Register<MainWindow, Foo>();
        }
    }

}

启动程序:

点击 click Me 按钮:

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

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

csharp 复制代码
ViewModelLocationProvider.Register(typeof(MainWindow).ToString(), typeof(Foo)); 

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

ViewModelLocationProvider.Register<MainWindow>(() => Container.Resolve<Foo>());
相关推荐
神罚天下ET9 小时前
c# ACME client (补充)
开发语言·c#
噗噗夹的TA之旅13 小时前
Shader 学习 21:自定义 Render Feature
学习·游戏·unity·c#·游戏引擎·图形渲染
脚踏实地皮皮晨14 小时前
003006001_WrapPanel控件
开发语言·c#·.net·wpf·visual studio
脚踏实地皮皮晨16 小时前
003005002_WPF StackPanel 基类官方类定义逐行深度解析
开发语言·windows·算法·c#·wpf·visual studio
用户2986985301416 小时前
Excel 转 PDF 免费在线工具,格式完美保留
人工智能·c#·excel
库拉库拉里16 小时前
深入理解 C# 异步编程:同步、Task.Wait () 与 await 的本质区别及实践指南
开发语言·c#
神罚天下ET17 小时前
.NET 新增功能系列文章——C# 中的新增功能
开发语言·c#·.net
caishenzhibiao19 小时前
缠论画线主图 同花顺期货通指标
java·c语言·c#
C囧囧21 小时前
利用SharpShell为属性添加标签页
c#·winform·扩展属性·sharpshell
Alex Gram21 小时前
双机热备软件哪个好
java·系统架构·c#·keepalived·高可用·双机热备·双机热备软件