Prism笔记

2025/11/13
23
0

一、View和ViewModel如何建立绑定关系的?

1.根据规则自动建立绑定关系

(1)Prism的默认规则(推荐)

项目名称.窗体名称——项目名称.窗体名称ViewModel

PrismBaseObj.MainWindow.xaml——PrismBaseObj.MainWindowViewModel.cs

项目名称.Views.窗体名称——项目名称.ViewModels.窗体名称ViewModel

PrismBaseObj.Views.Window1.xaml——PrismBaseObj.ViewModels.Window1ViewModel.cs

注意:如果窗体(用户控件、Page)名称本来就是View结尾(如UserView),则视图模型名称不能重复View(UserViewModel)。


1.引入Nugget程序包 包名Prism.DryIoc

2.改app.xmal

引入xmlns:prism="http://prismlibrary.com/"

改成prism:PrismApplication

删掉StartupUri="MainWindow.xaml"

<prism:PrismApplication x:Class="PrismBaseObj.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:PrismBaseObj"
             xmlns:prism="http://prismlibrary.com/">
    <prism:PrismApplication.Resources>
​
    </prism:PrismApplication.Resources>
</prism:PrismApplication>

3.创建MainWindowViewModel.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
​
namespace PrismBaseObj
{
    public class MainWindowViewModel
    {
        public string UserName { get; set; } = "张三";
    }
}
​

4.MainWindow.xaml中写入绑定

<Window x:Class="PrismBaseObj.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:PrismBaseObj"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <TextBlock Text="{Binding UserName}" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="50"/>
    </Grid>
</Window>

5.改App.xaml.cs

继承PrismApplication

实现抽象成员,删掉throw new NotImplementedException();

using System.Configuration;
using System.Data;
using System.Windows;
​
namespace PrismBaseObj
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : PrismApplication
    {
        /// <summary>
        /// 启动窗体
        /// </summary>
        /// <returns></returns>
        protected override Window CreateShell()
        {
            return Container.Resolve<MainWindow>();
        }
​
        /// <summary>
        /// 注册服务
        /// </summary>
        /// <param name="containerRegistry"></param>
        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            
        }
    }
}

(2)自定义规则(了解)

(a)自定义规则

1.App.xaml.cs文件中重写ConfigureViewModelLocator方法

        /// <summary>
        /// 自定义规则
        /// </summary>
        protected override void ConfigureViewModelLocator()
        {
            //视图模型以VM结尾
            ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver(SetViewModel);
        }

2.生成方法SetViewModel

        private Type? SetViewModel(Type viewType)
        {
            //1、PrismBaseObj.Views.视图名称
            //2、PrismBaseObj.ViewModels.视图名称VM
            string vmPath = viewType.FullName.Replace("Views", "ViewModels") + "VM";
            return Type.GetType(vmPath);
        }

(b)直接建立绑定关系(了解)

App.xaml.cs文件中重写ConfigureViewModelLocator方法

        /// <summary>
        /// 自定义规则
        /// </summary>
        protected override void ConfigureViewModelLocator()
        {
            //直接建立绑定关系
            ViewModelLocationProvider.Register<Window1, Window1VM>();
        }

(3)不需要绑定规则

1.消除默认规则方法:

Window.xaml文件中

引入xmlns:prism="http://prismlibrary.com/"

配置prism:ViewModelLocator.AutoWireViewModel="False"

2.消除后还需要绑定

Window.xaml.cs文件中设置this.DataContext上下文

二、BindableBase绑定通知

1、直接传

Window1.xaml

<Window x:Class="PrismBaseObj.Views.Window1"
        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:PrismBaseObj.Views"
        mc:Ignorable="d"
        xmlns:prism="http://prismlibrary.com/"
        Title="Window1" Height="450" Width="800">
    <Grid>
        <StackPanel>
            <TextBlock Text="{Binding UName}" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="25" Margin="0,50,0,0"/>
            <Button Height="30" Width="100" Margin="0,50,0,0" Command="{Binding EditNameCmm}">修改姓名</Button>
        </StackPanel>
    </Grid>
</Window>

Window1ViewModel.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PrismBaseObj.ViewModels
{
    public class Window1ViewModel:BindableBase
    {
        private string _UName = "lisiwangwu";

        public string UName
        {
            get { return _UName; }
            set 
            { 
                //第一种
                //_UName = value;
                //RaisePropertyChanged();

                //第二种
                //SetProperty(ref _UName, value);
                SetProperty(ref _UName, value, () =>
                {
                    if (_UName == "")
                    {
                        MessageBox.Show("不能为空");
                    }
                });

                //第三种
                //_UName = value;
                //RaisePropertyChanged(nameof(UName));
            }
        }

        public DelegateCommand EditNameCmm { get; set; }

        public Window1ViewModel()
        {
            //EditNameCmm = new DelegateCommand(() =>
            //{
            //    UName = "张三";
            //});

            EditNameCmm = new DelegateCommand(EditName);
        }

        private void EditName()
        {
            UName = "";
        }
    }
}

三、Delegate

1.不带参数的

同2.1内容

2.带参数的

UserInfo.cs (文件夹——Model)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PrismBaseObj.Model
{
    public class UserInfo
    {
        public string IdCard { get; set; }
        public string UName { get; set; }
    }
}

Window1ViewModel.cs

using PrismBaseObj.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace PrismBaseObj.ViewModels
{
    public class Window1ViewModel:BindableBase
    {
        private UserInfo _UserInfo;

        public UserInfo UserInfo
        {
            get { return _UserInfo; }
            set 
            { 
                _UserInfo = value;
                RaisePropertyChanged();
            }
        }

        public DelegateCommand<UserInfo> EditNameCmm { get; set; }

        public Window1ViewModel()
        {
            UserInfo = new UserInfo();
            EditNameCmm = new DelegateCommand<UserInfo>(EditName);
        }

        private void EditName(UserInfo userInfo)
        {
            MessageBox.Show($"用户身份证{userInfo.IdCard},用户姓名{userInfo.UName}");
        }
    }
}

Window1.xaml

<Window x:Class="PrismBaseObj.Views.Window1"
        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:PrismBaseObj.Views"
        mc:Ignorable="d"
        xmlns:prism="http://prismlibrary.com/"
        Title="Window1" Height="450" Width="800">
    <Grid>
        <StackPanel>
            <TextBox Text="{Binding UserInfo.IdCard}" Margin="0,5" Height="30" Width="120"></TextBox>
            <TextBox Text="{Binding UserInfo.UName}" Margin="0,5" Height="30" Width="120"></TextBox>
            <Button Height="30" Width="100" Margin="0,30,0,0" 
                    Command="{Binding EditNameCmm}" CommandParameter="{Binding UserInfo}">修改姓名</Button>
        </StackPanel>
    </Grid>
</Window>

3.带条件的命令执行

A.以文本框是否有输入内容来决定按钮是否禁用

1.ExeCmm = new DelegateCommand(Exe,CanExe);使用带两个参数的重载构造

2.实现CanExe方法return !string.IsNullOrEmpty(Name);

3.Name属性set{}中添加ExeCmm.RaiseCanExecuteChanged();//重新检查

4.窗口TextBox控件中Text添加绑定UpdateSourceTrigger=PropertyChanged

CheckWinViewModel.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
​
namespace PrismBaseObj.ViewModels
{
    public class CheckWinViewModel:BindableBase
    {
        private string _Name;
​
        public string Name
        {
            get { return _Name; }
            set 
            { 
                _Name = value;
                RaisePropertyChanged();
​
                ExeCmm.RaiseCanExecuteChanged();//重新检查
            }
        }
​
        public DelegateCommand ExeCmm { get; set; }//执行命令
​
        public CheckWinViewModel()
        {
            ExeCmm = new DelegateCommand(Exe,CanExe);
        }
​
        private bool CanExe()
        {
            return !string.IsNullOrEmpty(Name);
        }
​
        /// <summary>
        /// 执行业务
        /// </summary>
        private void Exe()
        {
            MessageBox.Show("已执行");
        }
    }
}

CheckWin.xaml

<Window x:Class="PrismBaseObj.Views.CheckWin"
        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:PrismBaseObj.Views"
        mc:Ignorable="d"
        Title="CheckWin" Height="450" Width="800">
    <Grid>
        <StackPanel>
            <TextBox Text="{Binding Name,UpdateSourceTrigger=PropertyChanged}" Margin="0,5" Height="30" Width="120"></TextBox>
            <Button Height="30" Width="100" Command="{Binding ExeCmm}">执行</Button>
        </StackPanel>
    </Grid>
</Window>

B.以传入参数进方法中判断来决定按钮是否禁用

CheckWinViewModel.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using static System.Runtime.InteropServices.JavaScript.JSType;
​
namespace PrismBaseObj.ViewModels
{
    public class CheckWinViewModel:BindableBase
    {
        public DelegateCommand<string> ExeCmm { get; set; }//执行命令
​
        public CheckWinViewModel()
        {
            ExeCmm = new DelegateCommand<string>(Exe,CanExe);
        }
​
        private bool CanExe(string num)
        {
            if(!int.TryParse(num,out int number))
            {
                return false; 
            }
            else
            {
                return number > 0;
            }
​
        }
​
        /// <summary>
        /// 执行业务
        /// </summary>
        private void Exe(string num)
        {
            MessageBox.Show("已执行");
        }
    }
}
​

CheckWin.xaml(CommandParameter值变化“abc”、“0”、“1”进行测试)

<Window x:Class="PrismBaseObj.Views.CheckWin"
        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:PrismBaseObj.Views"
        mc:Ignorable="d"
        Title="CheckWin" Height="450" Width="800">
    <Grid>
        <StackPanel>
            <TextBox Text="{Binding Name,UpdateSourceTrigger=PropertyChanged}" Margin="0,5" Height="30" Width="120"></TextBox>
            <Button Height="30" Width="100" Command="{Binding ExeCmm}" CommandParameter="1">执行</Button>
        </StackPanel>
    </Grid>
</Window>
​

四、弹窗

1.创建并使用

1.创建弹窗视图——页面/用户控件(Views文件夹.xaml文件+ViewModels文件夹.cs文件)

2.App.xaml.cs文件中注册containerRegistry.RegisterDialog<DialogUC>();

3.ViewModel类实现IDialogAware接口

4.通过主窗口构造函数参数IDialogService类型取出。

需要取的服务较多(弹窗、区域化、模块化等)时采用另一种方式:

a.参数改用IContainer类型(IContainer container)

b.方法中通过resolve方法取出IDialogService dialogService = container.Resolve<IDialogService>()

Window1.xaml

<Window x:Class="PrismBaseObj.Views.Window1"
        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:PrismBaseObj.Views"
        mc:Ignorable="d"
        xmlns:prism="http://prismlibrary.com/"
        Title="Window1" Height="450" Width="800">
    <Grid>
        <Button Height="45" Width="100" Command="{Binding OpenCmm}">弹出窗口</Button>
    </Grid>
</Window>

Window1ViewModel.cs

using PrismBaseObj.Model;
using System;
using System.CodeDom;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace PrismBaseObj.ViewModels
{
    public class Window1ViewModel : BindableBase
    {
        public DelegateCommand OpenCmm {  get; set; }//打开弹窗命令

        public Window1ViewModel(IDialogService dialogService)
        {
            OpenCmm = new DelegateCommand(() =>
            {
                //打开弹窗
                //dialogService.Show("DialogUC");      //主界面能操作
                dialogService.ShowDialog("DialogUC");//主界面不能操作
            });
        }
    }
}

App.xaml.cs

using PrismBaseObj.ViewModels;
using PrismBaseObj.Views;
using System.Configuration;
using System.Data;
using System.Windows;

namespace PrismBaseObj
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : PrismApplication
    {
        /// <summary>
        /// 启动窗体
        /// </summary>
        /// <returns></returns>
        protected override Window CreateShell()
        {
            return Container.Resolve<Window1>();
        }

        /// <summary>
        /// 注册服务
        /// </summary>
        /// <param name="containerRegistry"></param>
        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            //注册弹窗
            containerRegistry.RegisterDialog<DialogUC>();//括号内参数为该弹窗别名,若有别名打开时需使用该别名
        }
    }

}

DialogUC.xaml

<UserControl x:Class="PrismBaseObj.Views.DialogUC"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:PrismBaseObj.Views"
             mc:Ignorable="d" 
             Height="300" Width="500"
             d:DesignHeight="450" d:DesignWidth="800">
    <Grid>
        <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" >这是一个弹窗</TextBlock>  
    </Grid>
</UserControl>

DialogUCViewModel.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PrismBaseObj.ViewModels
{
    public class DialogUCViewModel : IDialogAware
    {
        public string Title => "弹窗1";

        public DialogCloseListener RequestClose { get; set; }//9.0

        /// <summary>
        /// 是否可以关闭
        /// </summary>
        /// <returns></returns>
        public bool CanCloseDialog()
        {
            return true;
        }

        /// <summary>
        /// 弹窗关闭时触发
        /// </summary>
        public void OnDialogClosed()
        {

        }

        /// <summary>
        /// 弹窗打开时触发
        /// </summary>
        /// <param name="parameters"></param>
        public void OnDialogOpened(IDialogParameters parameters)
        {

        }
    }
}

2.弹窗样式

自定义弹窗样式

<UserControl x:Class="PrismBaseObj.Views.DialogUC"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:PrismBaseObj.Views"
             mc:Ignorable="d" 
             xmlns:prism="http://prismlibrary.com/"
             d:DesignHeight="450" d:DesignWidth="800">
    <prism:Dialog.WindowStyle>
        <Style TargetType="Window">
            <Setter Property="Height" Value="300"></Setter>
            <Setter Property="Width" Value="500"></Setter>
            <Setter Property="WindowChrome.WindowChrome">
                <Setter.Value>
                    <WindowChrome GlassFrameThickness="0"></WindowChrome>
                </Setter.Value>
            </Setter>
        </Style>
    </prism:Dialog.WindowStyle>
    <Grid>
        <TextBlock Text="{Binding Content}" VerticalAlignment="Center" HorizontalAlignment="Center" ></TextBlock>  
    </Grid>
</UserControl>

3.自定义弹出窗口

所有弹窗外包一层壳(window)

1.创建壳窗口DialogOuter.xaml (必须是窗体)

2.DialogOuter.xaml.csDialogOuter类实现IDialogWindow接口public IDialogResult Result { get; set; }

3.App.xaml.cs中注册containerRegistry.RegisterDialogWindow<DialogOuter>();

4.弹窗相互传递参数

A.主窗口——>弹窗

1.主窗口Window1ViewModel.cs的命令方法中创建dialogParameters实例并添加参数。

2.DialogUCViewModel.cs中创建IDialogParameters _parameters接收主窗体传过来的参数,_parametersOnDialogOpened方法中赋值。

3.通过命令绑定的方法中_parameters.GetValue<UserInfo>("userInfo");使用

Window1ViewModel.cs

using Prism.Dialogs;
using PrismBaseObj.Model;
using System;
using System.CodeDom;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace PrismBaseObj.ViewModels
{
    public class Window1ViewModel : BindableBase
    {
        public DelegateCommand OpenCmm {  get; set; }//打开弹窗命令

        public Window1ViewModel(IDialogService dialogService)
        {
            OpenCmm = new DelegateCommand(() =>
            {
                //打开弹窗
                DialogParameters dialogParameters = new DialogParameters();
                dialogParameters.Add("userName", "张三");//Key,Value——对象类型
                dialogParameters.Add("userInfo", new UserInfo() { UserId = 1,UserName = "lisi"});
                dialogService.Show("DialogUC",dialogParameters,null);//null处参数为回调函数

            });
        }
    }
}

DialogUCViewModel.cs

using DryIoc;
using PrismBaseObj.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PrismBaseObj.ViewModels
{
    public class DialogUCViewModel : IDialogAware
    {
        public string Title => "弹窗1";

        public string Content => "内容";
        public DialogCloseListener RequestClose { get; set; }//9.0

        public DelegateCommand ExeBusinCmm {  get; set; }

        public DialogUCViewModel()
        {
            ExeBusinCmm = new DelegateCommand(ExeBusin);
        }

        private IDialogParameters _parameters;//接收主窗体传过来的参数

        private void ExeBusin()
        {
            string uName = _parameters.GetValue<string>("userName");//参数为主窗口dialogParameters添加时设置的Key值
            UserInfo userInfo = _parameters.GetValue<UserInfo>("userInfo");
        }

        /// <summary>
        /// 是否可以关闭
        /// </summary>
        /// <returns></returns>
        public bool CanCloseDialog()
        {
            return true;
        }

        /// <summary>
        /// 弹窗关闭时触发
        /// </summary>
        public void OnDialogClosed()
        {

        }

        /// <summary>
        /// 弹窗打开时触发
        /// </summary>
        /// <param name="parameters"></param>
        public void OnDialogOpened(IDialogParameters parameters)
        {
            _parameters = parameters;
            string uName = parameters.GetValue<string>("userName");
            UserInfo userInfo = parameters.GetValue<UserInfo>("userInfo");

        }
    }
}

UserInfo.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PrismBaseObj.Model
{
    public class UserInfo
    {
        public int UserId { get; set; }
        public string UserName { get; set; }
    }
}

DialogUC.xaml

<UserControl x:Class="PrismBaseObj.Views.DialogUC"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:PrismBaseObj.Views"
             mc:Ignorable="d" 
             xmlns:prism="http://prismlibrary.com/"
             d:DesignHeight="450" d:DesignWidth="800">
    <StackPanel>
        <TextBlock Text="{Binding Content}" VerticalAlignment="Center" HorizontalAlignment="Center" ></TextBlock>
        <Button Height="30" Width="80" Margin="0,5" Command="{Binding ExeBusinCmm}">执行业务</Button>
    </StackPanel>
</UserControl>

B.弹窗——>主窗口

1. 弹窗中数据传回时

a.命令绑定的处理业务方法传回数据:OnDialogClosed 方法中创建DialogResult dialogResult 写入参数,通过 RequestClose.Invoke(dialogResult); 传回主窗口(会导致弹窗关闭)

b.弹窗关闭时传回数据:OnDialogClosed 方法中创建DialogResult dialogResult 写入参数,通过 RequestClose.Invoke(dialogResult); 传回主窗口

2.主窗体中dialogService.Show("DialogUC",dialogParameters,ExeRstBusin); 生成ExeRstBusin方法,通过result.Parameters.GetValue<string>("rstMsg"); 读取到返回数据

Window1ViewModel.cs

using Prism.Dialogs;
using PrismBaseObj.Model;
using System;
using System.CodeDom;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace PrismBaseObj.ViewModels
{
    public class Window1ViewModel : BindableBase
    {
        public DelegateCommand OpenCmm {  get; set; }//打开弹窗命令
        public DelegateCommand OpenNewCmm {  get; set; }//打开新弹窗命令

        public Window1ViewModel(IDialogService dialogService)
        {
            OpenCmm = new DelegateCommand(() =>
            {
                //打开弹窗
                DialogParameters dialogParameters = new DialogParameters();
                dialogParameters.Add("userName", "张三");//Key,Value——对象类型
                dialogParameters.Add("userInfo", new UserInfo() { UserId = 1,UserName = "lisi"});
                dialogService.Show("DialogUC",dialogParameters,ExeRstBusin);

            });

            OpenNewCmm = new DelegateCommand(() =>
            {
                //打开弹窗
                dialogService.Show("DialogUCNew");
            });
        }

        /// <summary>
        /// 处理弹窗返回的结果
        /// </summary>
        /// <param name="result"></param>
        private void ExeRstBusin(IDialogResult result)
        {
            string retrunMsg = result.Parameters.GetValue<string>("exeRstMsg");
        }
    }
}

DialogUCViewModel.cs

using DryIoc;
using PrismBaseObj.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PrismBaseObj.ViewModels
{
    public class DialogUCViewModel : IDialogAware
    {
        public string Title => "弹窗1";

        public string Content => "内容";
        public DialogCloseListener RequestClose { get; set; }//9.0

        public DelegateCommand ExeBusinCmm {  get; set; }

        public DialogUCViewModel()
        {
            ExeBusinCmm = new DelegateCommand(ExeBusin);
        }

        private IDialogParameters _parameters;//接收主窗体传过来的参数

        private void ExeBusin()
        {
            string uName = _parameters.GetValue<string>("userName");//参数为主窗口dialogParameters添加时设置的Key值
            UserInfo userInfo = _parameters.GetValue<UserInfo>("userInfo");

            //业务处理
            DialogResult dialogResult = new DialogResult();
            dialogResult.Parameters.Add("exeRstMsg", "成功了");
            RequestClose.Invoke(dialogResult);
        }

        /// <summary>
        /// 是否可以关闭
        /// </summary>
        /// <returns></returns>
        public bool CanCloseDialog()
        {
            return true;
        }

        /// <summary>
        /// 弹窗关闭时触发
        /// </summary>
        public void OnDialogClosed()
        {
            //弹窗关闭时传回主窗口数据
            //DialogResult dialogResult = new DialogResult();
            //dialogResult.Parameters.Add("rstMsg", "成功了");
            //RequestClose.Invoke(dialogResult);
        }

        /// <summary>
        /// 弹窗打开时触发
        /// </summary>
        /// <param name="parameters"></param>
        public void OnDialogOpened(IDialogParameters parameters)
        {
            _parameters = parameters;
            string uName = parameters.GetValue<string>("userName");
            UserInfo userInfo = parameters.GetValue<UserInfo>("userInfo");

        }
    }
}

五、消息对象

1.订阅

1.创建MsgEvent类并继承PubSubEvent

2.主窗口按钮绑定发布命令<Button Height="45" Width="100" Command="{Binding PubCmm}" Margin="10">发布</Button>

3.主窗口视图模型中实现发布命令(构造函数添加参数IEventAggregator eventAggregator)具体实现eventAggregator.GetEvent<MsgEvent>().Publish();

4.弹窗按钮绑定订阅命令<Button Height="45" Width="100" Command="{Binding SubCmm}" Margin="10">订阅</Button>

5.弹窗对应视图模型实现订阅命令eventAggregator.GetEvent<MsgEvent>().Subscribe(() =>{MessageBox.Show("弹窗2收到了");});

2.取消订阅

1.弹窗按钮绑定取消订阅命令<Button Height="45" Width="100" Command="{Binding UnSub2Cmm}" Margin="10">取消订阅2</Button>

2.将订阅的业务单独生成为一个方法ExeSubBusin

3.弹窗对应视图模型实现取消订阅命令eventAggregator.GetEvent<MsgEvent>().Unsubscribe(ExeSubBusin); 取消订阅该方法。

App.xaml

<prism:PrismApplication x:Class="PrismBaseObj.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:PrismBaseObj"
             xmlns:prism="http://prismlibrary.com/">
    <prism:PrismApplication.Resources>

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

App.xaml.cs

using PrismBaseObj.ViewModels;
using PrismBaseObj.Views;
using System.Configuration;
using System.Data;
using System.Windows;

namespace PrismBaseObj
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : PrismApplication
    {
        /// <summary>
        /// 启动窗体
        /// </summary>
        /// <returns></returns>
        protected override Window CreateShell()
        {
            return Container.Resolve<Window1>();
        }

        /// <summary>
        /// 注册服务
        /// </summary>
        /// <param name="containerRegistry"></param>
        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            //注册弹窗
            containerRegistry.RegisterDialog<DialogUC1>();
            containerRegistry.RegisterDialog<DialogUC2>();

        }
    }

}

Window1.xaml

<Window x:Class="PrismBaseObj.Views.Window1"
        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:PrismBaseObj.Views"
        mc:Ignorable="d"
        xmlns:prism="http://prismlibrary.com/"
        Title="Window1" Height="450" Width="800">
    <StackPanel VerticalAlignment="Center">
        <Button Height="45" Width="100" Command="{Binding Open1Cmm}" Margin="10">弹出窗口一</Button>
        <Button Height="45" Width="100" Command="{Binding Open2Cmm}" Margin="10">弹出窗口二</Button>

        <Button Height="45" Width="100" Command="{Binding PubCmm}" Margin="10">发布</Button>
    </StackPanel>
</Window>

Window1ViewModel.cs

using Prism.Dialogs;
using PrismBaseObj.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace PrismBaseObj.ViewModels
{
    public class Window1ViewModel
    {
        public DelegateCommand Open1Cmm {  get; set; }
        public DelegateCommand Open2Cmm {  get; set; }
        public DelegateCommand PubCmm {  get; set; }

        public Window1ViewModel(IDialogService dialogService,IEventAggregator eventAggregator)
        {
            Open1Cmm = new DelegateCommand(() =>
            {
                dialogService.Show("DialogUC1");
            });

            Open2Cmm = new DelegateCommand(() =>
            {
                dialogService.Show("DialogUC2");
            });

            PubCmm = new DelegateCommand(() =>
            {
                eventAggregator.GetEvent<MsgEvent>().Publish();//不带参数的发布
            });
        }
    }
}

DialogUC1.xaml

<UserControl x:Class="PrismBaseObj.Views.DialogUC1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:PrismBaseObj.Views"
             mc:Ignorable="d" 
             xmlns:prism="http://prismlibrary.com/"
             Height="300" Width="500"
             d:DesignHeight="450" d:DesignWidth="800">
    <StackPanel>
        <Button Height="45" Width="100" Command="{Binding Sub1Cmm}" Margin="10">订阅1</Button>
    </StackPanel>
</UserControl>

DialogUC1ViewModel.cs

using DryIoc;
using PrismBaseObj.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace PrismBaseObj.ViewModels
{
    public class DialogUC1ViewModel : IDialogAware
    {
        public string Title => "弹窗1";

        public DialogCloseListener RequestClose { get; set; }
        public DelegateCommand Sub1Cmm { get; set; }//订阅命令

        public DialogUC1ViewModel(IEventAggregator eventAggregator)
        {
            Sub1Cmm = new DelegateCommand(() =>
            {
                eventAggregator.GetEvent<MsgEvent>().Subscribe(() =>
                {
                    MessageBox.Show("弹窗1收到了");
                });
            });
        }

        public bool CanCloseDialog()
        {
            return true;
        }

        public void OnDialogClosed()
        {

        }

        public void OnDialogOpened(IDialogParameters parameters)
        {

        }
    }
}

DialogUC2.xaml

<UserControl x:Class="PrismBaseObj.Views.DialogUC2"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:PrismBaseObj.Views"
             mc:Ignorable="d" 
             Height="300" Width="500"
             d:DesignHeight="450" d:DesignWidth="800">
    <StackPanel>
        <Button Height="45" Width="100" Command="{Binding Sub2Cmm}" Margin="10">订阅2</Button>
        <Button Height="45" Width="100" Command="{Binding UnSub2Cmm}" Margin="10">取消订阅2</Button>
    </StackPanel>
</UserControl>

DialogUC2ViewModel.cs

using PrismBaseObj.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace PrismBaseObj.ViewModels
{
    public class DialogUC2ViewModel : IDialogAware
    {
        public string Title { get; set; } = "弹窗2";

        public DialogCloseListener RequestClose { get; set; }

        public DelegateCommand Sub2Cmm {  get; set; }//订阅命令
        public DelegateCommand UnSub2Cmm {  get; set; }//取消订阅命令

        public DialogUC2ViewModel(IEventAggregator eventAggregator)
        {
            Sub2Cmm = new DelegateCommand(() =>
            {
                eventAggregator.GetEvent<MsgEvent>().Subscribe(ExeSubBusin);
            });

            UnSub2Cmm = new DelegateCommand(() =>
            {
                eventAggregator.GetEvent<MsgEvent>().Unsubscribe(ExeSubBusin);
            });

        }

        /// <summary>
        /// 收到订阅的消息后处理的业务
        /// </summary>
        private void ExeSubBusin()
        {
            MessageBox.Show("弹窗2收到了");
        }

        public bool CanCloseDialog()
        {
            return true;
        }

        public void OnDialogClosed()
        {

        }

        public void OnDialogOpened(IDialogParameters parameters)
        {

        }
    }
}