首页 > 其他分享 >WPF MVVM框架------ Prism中的对话服务(IDialogService)

WPF MVVM框架------ Prism中的对话服务(IDialogService)

时间:2023-02-26 16:46:22浏览次数:35  
标签:userName string MVVM 对话框 void IDialogService Prism new public

在wpf中,我们平时使用对话框最常用的一种方式就是新建一个窗口,然后new 出来后再调用ShowDialog()方法显示弹窗,prism中为我们提供了对话服务接口,我们可以通过这个服务向窗体传递参数或传出参数

这一章就记录一下prism中对话服务的使用

准备工作

大部分信息管理系统在进入系统之前都会有用户信息验证,都需要一个登录页面。右击Views新建一个用户空间命名为LoginView.xaml

简单进行一个布局,添加两个输入框和两个按钮,如下图

LoginView.xaml

<UserControl x:Class="MvvmBase.PrismDemo.Views.LoginView"
             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:MvvmBase.PrismDemo.Views"
             xmlns:pwd="clr-namespace:Common.Wpf.ControlHelperLib.Password;assembly=Common.Wpf.ControlHelperLib"
             xmlns:prism="http://prismlibrary.com/"
             mc:Ignorable="d"
             d:DesignHeight="200"
             d:DesignWidth="300">
    <!--设置窗体大小-->
    <prism:Dialog.WindowStyle>
        <Style TargetType="Window">
            <!--窗体的宽和高根据内容的大小设置-->
            <Setter Property="SizeToContent"
                    Value="WidthAndHeight" />
            <!--不允许调整窗体尺寸-->
            <Setter Property="ResizeMode"
                    Value="NoResize" />
            <!--设置窗体的启动位置在屏幕中间-->
            <Setter Property="prism:Dialog.WindowStartupLocation"
                    Value="CenterScreen" />
        </Style>
    </prism:Dialog.WindowStyle>
    <Grid>
        <StackPanel Margin="50">
            <StackPanel Orientation="Horizontal"
                        HorizontalAlignment="Center">
                <Label Content="账号" />
                <TextBox  Width="150"
                          VerticalContentAlignment="Center"
                          Text="{Binding UserName}" />
            </StackPanel>
            <StackPanel Orientation="Horizontal"
                        HorizontalAlignment="Center"
                        Margin="0 10 0 0">
                <Label Content="密码" />
                <pwd:LayPassword Width="150"
                                 VerticalContentAlignment="Center"
                                 Style="{StaticResource LayPasswordTemplate}"
                                 Text="{Binding Password}" />
            </StackPanel>
            <StackPanel Orientation="Horizontal"
                        HorizontalAlignment="Center"
                        Margin="0 10 0 0">
                <Button Content="确定"
                        Width="40"
                        Height="25"
                        Margin="0 0 10 0"
                        Command="{Binding LoginCommand}" />
                <Button Content="取消"
                        Width="40"
                        Height="25"
                        Command="{Binding CancelCommand}" />
            </StackPanel>
        </StackPanel>
    </Grid>
</UserControl>

新建对应的ViewModel,右击ViewModels 新建类LoginViewModel.cs,由于这个页面是作为Dialog注册到对话服务的,所以这个ViewModel类需要实现接口IDialogAware

LoginViewModel.cs
public class LoginViewModel : BindableBase, IDialogAware
{
    /// <summary>
    /// 对话框标题
    /// </summary>
    public string Title => "登录";

    /// <summary>
    /// 调用这个事件,可关闭当前对话框并传递一个操作结果出去
    /// </summary>
    public event Action<IDialogResult> RequestClose;

    private string _userName;
    /// <summary>
    /// 用户名
    /// </summary>
    public string UserName
    {
        get { return _userName; }
        set { _userName = value; RaisePropertyChanged(); }
    }

    private string _password;
    /// <summary>
    /// 密码
    /// </summary>
    public string Password
    {
        get { return _password; }
        set { _password = value; RaisePropertyChanged(); }
    }
    /// <summary>
    /// 登录命令
    /// </summary>
    public DelegateCommand LoginCommand { get; private set; }
    /// <summary>
    /// 取消命令
    /// </summary>
    public DelegateCommand CancelCommand { get; private set; }

    public LoginViewModel()
    {
        LoginCommand = new DelegateCommand(DoLoginCommand);
        CancelCommand = new DelegateCommand(DoCancelCommand);
    }

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

    /// <summary>
    /// 当窗口关闭时执行此方法
    /// </summary>
    public void OnDialogClosed()
    {
    }

    /// <summary>
    /// 当窗口打开时执行次方法
    /// </summary>
    /// <param name="parameters">可通过parameters这个参数从外界传递参数进来</param>
    public void OnDialogOpened(IDialogParameters parameters)
    {
    }

    public void DoLoginCommand()
    {
        DialogParameters userInfo = new DialogParameters();
        userInfo.Add("userName", UserName);
        userInfo.Add("passWord", Password);
        RequestClose.Invoke(new DialogResult(ButtonResult.OK, userInfo));
    }

    public void DoCancelCommand()
    {
        RequestClose.Invoke(new DialogResult(ButtonResult.Cancel));
    }
}

执行确定命令时,就会调用 RequestClose,关闭对话框,并将用户名和密码作为参数传递出去

 修改App.cs

  1.修改启动项为MainView

  2.在容器中注入对话框LoginView

App.cs

public partial class App : PrismApplication
{
    protected override Window CreateShell()
    {
        return Container.Resolve<MainView>();
    }

    protected override void OnInitialized()
    {
        var dig = Container.Resolve<IDialogService>();
        dig.ShowDialog("LoginView", callback =>
                       {
                           if (callback.Result == ButtonResult.OK)
                           {
                               string userName = callback.Parameters.GetValue<string>("userName");
                               string passWord = callback.Parameters.GetValue<string>("passWord");
                               base.OnInitialized();
                           }
                           else
                           {
                               App.Current.Shutdown();
                               return;
                           }
                       });
    }

    protected override void RegisterTypes(IContainerRegistry containerRegistry)
    {
        containerRegistry.RegisterForNavigation<RegionFirstView, RegionFirstViewModel>();
        containerRegistry.RegisterForNavigation<RegionSecondView, RegionSecondViewModel>();
        containerRegistry.RegisterDialog<LoginView, LoginViewModel>();
    }
}

在初始化化的时候,首先通过容器拿到IDialogService

var dig = Container.Resolve<IDialogService>();
调用ShowDialog(),
第一个参数为调用窗体的别名,根据别名查找对应的View;
第二个参数为一个委托(回调),当窗体关闭时,会进入次此回调,可获取操作结果和传出的参数

演示
账号密码都输入123 点击确定  进到登录方法

 


 点击继续进入回调 在这里可以拿到操作结果和传递过来的参数

 

 

 

  

 

标签:userName,string,MVVM,对话框,void,IDialogService,Prism,new,public
From: https://www.cnblogs.com/just-like/p/17156837.html

相关文章

  • MVVMToolkit入门教程
    MVVMToolkitMVVMLight已经停止维护,可以考虑MVVMToolkit来替代,​​MVVMToolkit官方文档​​​两个框架的基本使用方法类似,下面介绍一下不同之处(建议先看上篇介绍MVVMLight的......
  • WPF MVVM系统入门-下
    WPFMVVM系统入门-下CommandManager接上文WPFMVVM系统入门-上,我们想把Command放在ViewModel中,而不是Model中,可以将CommandBase类改为publicclassCommandBase:ICommand{......
  • WPF MVVM系统入门-上
    WPFMVVM系统入门-上Models:存放数据的模型,实体对象Views:可视化界面ViewModels:业务逻辑。ViewModels与Models的联系会更紧密,而Views页面会主动绑定ViewModels中的数据,原则......
  • [WPF]MVVM的数据绑定
    啥是MVVM?我理解的MVVM是Model(数据),View(界面),ViewModel(数据与界面之间的桥梁)的缩写,是一种编程模式。前期需要多花一些时间去编辑绑定,在后期维护方便。只需要关注数据即可。如......
  • WPF中MVVM模式下loaded无法触发问题
    经过实践检测,当时View上设置了Window.SizeToContent="WidthAndHeight"时候<i:Interaction.Triggers><i:EventTriggerEventName="Loaded"><i:Invoke......
  • 10分钟搞定简易MVVM
    实现一个简易的MVVM分为这么几步来1.类Vue:这个类接收的是一个options。el属性:根元素的iddata属性:双向绑定的数据。2.Dep类:subNode数组:存放所依赖这个属性的依......
  • 10分钟了解MVVM,实现简易MVVM
    MVVM是Model-View-ViewModel缩写,也就是把MVC中的Controller演变成ViewModel。Model层代表数据模型,View代表UI组件,ViewModel是View和Model层的桥梁,数据会......
  • WPF MVVM框架------ Prism中的区域导航(RegionManager)
    本次简单记录一下Prism中区域导航功能的使用第一步准备导航页面新建两个UserControl(RegionFirstView.xaml,RegionSecondView.xaml),作为导航的目标页面简单在两个页......
  • 6 mvvm设计模式
    Vue的createApp和mount方法讲解​​简介​​​​最常见的Vue初级代码​​​​createApp()和mount()方法讲解​​​​createApp()方法的基本参数讲解​​​​如何获......
  • MVC与MVVM
    MVC:是Model(模型)View(视图)Controller(控制器)的缩写,是服务端分层开发的概念,本质上是用一种将数据、界面显示、业务逻辑分离的方法组织代码的软件开发设计典范。(1)Model:数据层,......