项目名称.窗体名称——项目名称.窗体名称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)
{
}
}
}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);
}App.xaml.cs文件中重写ConfigureViewModelLocator方法
/// <summary>
/// 自定义规则
/// </summary>
protected override void ConfigureViewModelLocator()
{
//直接建立绑定关系
ViewModelLocationProvider.Register<Window1, Window1VM>();
}1.消除默认规则方法:
Window.xaml文件中
引入xmlns:prism="http://prismlibrary.com/"
配置prism:ViewModelLocator.AutoWireViewModel="False"
2.消除后还需要绑定
Window.xaml.cs文件中设置this.DataContext上下文
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 = "";
}
}
}同2.1内容
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>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>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.创建弹窗视图——页面/用户控件(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)
{
}
}
}自定义弹窗样式
<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>所有弹窗外包一层壳(window)
1.创建壳窗口DialogOuter.xaml (必须是窗体)
2.DialogOuter.xaml.cs 中DialogOuter类实现IDialogWindow接口public IDialogResult Result { get; set; }
3.App.xaml.cs中注册containerRegistry.RegisterDialogWindow<DialogOuter>();
1.主窗口Window1ViewModel.cs的命令方法中创建dialogParameters实例并添加参数。
2.DialogUCViewModel.cs中创建IDialogParameters _parameters接收主窗体传过来的参数,_parameters 在OnDialogOpened方法中赋值。
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>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.创建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收到了");});
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)
{
}
}
}