Wpf 使用 Prism 实战开发Day31

登录数据绑定

1.首先在LoginViewModel 登录逻辑处理类中,创建登录要绑定属性和命令

public class LoginViewModel : BindableBase, IDialogAware
{public LoginViewModel(){ExecuteCommand = new DelegateCommand<string>(Execure);}public string Title { get; set; } = "ToDo"; //设置窗口标题public event Action<IDialogResult> RequestClose;public DelegateCommand<string> ExecuteCommand { get; private set; }private string account;/// <summary>/// 账户/// </summary>public string Account{get { return account; }set { account = value; RaisePropertyChanged(); }}private string passWord;/// <summary>/// 密码/// </summary>public string PassWord{get { return passWord; }set { passWord = value; RaisePropertyChanged(); }}public bool CanCloseDialog(){return true;}public void OnDialogClosed(){}public void OnDialogOpened(IDialogParameters parameters){}private void Execure(string obj){switch (obj){case "Login":Login();break;case "LoginOut":LoginOut();break;}}void Login(){}void LoginOut(){}
}

2.属性和命令创建完成后,在前端LoginView.xaml 中,需要对登录按钮和输入框进行绑定后台对应的属性以及命令(进行数据绑定)

由于密码文本输入框是 PasswordBox,并且不支持数据绑定。需要创建一个密码附加属性类,通过绑定附加属性类间接的让 PasswordBox 支持数据绑定。

 2.1 创建密码框附加属性类(PassWordExtensions)

  • 快速创建附加属性模板的命令:在PassWordExtensions 类中输入 propa 回车即可

  • 然后就是按需进行修改,如下示例。是为密码框创建一个附加属性的修改。并且在整个附加属性类中,定义完成一些属性后,例如把GetMyProperty修改成GetPassWord。主要目的是对附加属性类里面的 PropertyMetadata 添加一个回调函数,并且在回调函数中进行对逻辑处理。当前定义的回调函数是一个密码框属性变更函数(OnPassWordPropertyChanged)。
 public class PassWordExtensions{public static string GetPassWord(DependencyObject obj){return (string)obj.GetValue(PassWordProperty);}public static void SetPassWord(DependencyObject obj, string value){obj.SetValue(PassWordProperty, value);}// Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...public static readonly DependencyProperty PassWordProperty =DependencyProperty.RegisterAttached("PassWord", typeof(string), typeof(PassWordExtensions), new PropertyMetadata(string.Empty,OnPassWordPropertyChanged));/// <summary>/// 密码属性变更回调函数/// </summary>/// <param name="sender">依赖对象</param>/// <param name="e">事件接收对象</param>/// <returns></returns>private static void OnPassWordPropertyChanged(DependencyObject sender,DependencyPropertyChangedEventArgs e){var oldPassword= sender as PasswordBox;//取到属性变更的依赖对象string newPassWord=(string)e.NewValue;//获取到密码框的新值if (oldPassword != null && oldPassword.Password != newPassWord){oldPassword.Password = newPassWord;//把新值重新赋给Password}}}
  • 密码附加属性类创建完成,还需要创建一个行为类(PassWordBehavior),继承自Behavior。目的是让创建的密码附加属性类和密码文本框之间进行绑定。
  1. 需要重写2个方法 OnAttached和OnDetaching
 /// <summary>/// 行为类/// </summary>public class PassWordBehavior: Behavior<PasswordBox>{protected override void OnAttached(){base.OnAttached();//拿到密码改变事件进行处理AssociatedObject.PasswordChanged += AssociatedObject_PasswordChanged;}private void AssociatedObject_PasswordChanged(object sender, RoutedEventArgs e){//在这个值改变的事件中,处理对应的业务逻辑var passwordBox= sender as PasswordBox;var newPassWord= PassWordExtensions.GetPassWord(passwordBox); //获取到密码的值if(passwordBox!=null && passwordBox.Password!= newPassWord){PassWordExtensions.SetPassWord(passwordBox, passwordBox.Password); //给指定的依懒对象设置新的密码值}}protected override void OnDetaching(){base.OnDetaching();AssociatedObject.PasswordChanged -= AssociatedObject_PasswordChanged; //注销事件}}

2.2 密码输入框 (PasswordBox) 中绑定附加属性类

  1. 在LoginView.xaml 中,引入附加属性类的命名空间  xmlns:pass="clr-namespace:MyToDo.Extensions"
  2. 引入附加属性类命名空间后,使用 pass:PassWordExtensions.PassWord 方式进行密码框数据绑定。 
  3. 引入behaviors 命名空间,添加密码行为,把当前密码框跟附加属性类的行为类进行关联。  xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
<PasswordBox Margin="0,10" md:HintAssist.Hint="请输入密码" DockPanel.Dock="Top"pass:PassWordExtensions.PassWord="{Binding PassWord,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"><!--添加密码行为--><i:Interaction.Behaviors><pass:PassWordBehavior/></i:Interaction.Behaviors>
</PasswordBox>
  • 密码绑定属性的时候,需要添加绑定的类型,Mode="TwoWay",即双向绑定。以及更新属性的时机:UpdateSourceTrigger=PropertyChanged

 3. LoginView.xaml 完整示例代码

<UserControl x:Class="MyToDo.Views.Dialog.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:MyToDo.Views.Dialog"xmlns:md="http://materialdesigninxaml.net/winfx/xaml/themes"xmlns:prism="http://prismlibrary.com/"xmlns:pass="clr-namespace:MyToDo.Extensions"xmlns:i="http://schemas.microsoft.com/xaml/behaviors"mc:Ignorable="d" Height="350" Width="600"><!--修改外观样式--><prism:Dialog.WindowStyle><Style TargetType="Window"><Setter Property="Width" Value="600"/><Setter Property="Height" Value="350"/><Setter Property="SizeToContent" Value="WidthAndHeight"/> <!--设置当前窗口大小--><Setter Property="ResizeMode" Value="NoResize"/> <!--不允许调整窗口大小--><Setter Property="prism:Dialog.WindowStartupLocation" Value="CenterScreen"/> <!--窗口启动位置--></Style></prism:Dialog.WindowStyle><Grid Background="White"><!--界面分左右两列--><Grid.ColumnDefinitions><ColumnDefinition Width="1.5*"/><ColumnDefinition/></Grid.ColumnDefinitions><Image Source="/Images/login.png" Margin="50"/><DockPanel Grid.Column="1" VerticalAlignment="Center" Margin="15"><TextBlock Text="欢迎使用" FontSize="22" FontWeight="Bold" Margin="0,10" DockPanel.Dock="Top"/><TextBox Margin="0,10" md:HintAssist.Hint="请输入账号" DockPanel.Dock="Top"Text="{Binding Account}"/><PasswordBox Margin="0,10" md:HintAssist.Hint="请输入密码" DockPanel.Dock="Top"pass:PassWordExtensions.PassWord="{Binding PassWord,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"><!--添加密码行为--><i:Interaction.Behaviors><pass:PassWordBehavior/></i:Interaction.Behaviors></PasswordBox><Button Content="登录系统" DockPanel.Dock="Top" Command="{Binding ExecuteCommand}" CommandParameter="Login"/><DockPanel LastChildFill="False" Margin="0,10"><TextBlock Text="注册账户"/><TextBlock Text="忘记密码?" DockPanel.Dock="Right"/></DockPanel></DockPanel></Grid>
</UserControl>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/20511.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue-标签选择

效果 选中后 代码 <span :class"[item.bealtrue?p_yx_span span_active :span p_yx]" click"onTagSelect(index)" v-for"(item,index) in tagList" :key"index" >{{item.name}} </span> // 列表值 tagList:[ {id: 1, na…

R语言ggplot2包绘制世界地图

数据和代码获取&#xff1a;请查看主页个人信息&#xff01;&#xff01;&#xff01; 1. 数据读取与处理 首先&#xff0c;从CSV文件中读取数据&#xff0c;并计算各国每日收入的平均签证成本。 library(tidyverse) ​ df <- read_csv("df.csv") %>% group_…

PostgreSQL基础(六):PostgreSQL基本操作(二)

文章目录 PostgreSQL基本操作(二) 一、字符串类型 二、日期类型 三、

基于分步傅立叶数值算法的一维非线性薛定谔方程求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于分步傅立叶数值算法的一维非线性薛定谔方程求解matlab仿真. 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 3.核心程序 ........................…

今天,组长和研发总监吵起来了 ...

插&#xff1a; AI时代&#xff0c;程序员或多或少要了解些人工智能&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家(前言 – 人工智能教程 ) 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家…

下载HF AutoTrain 模型的配置文件

下载HF AutoTrain 模型的配置文件 一.在huggingface上创建AutoTrain项目二.通过HF用户名和autotrain项目名,拼接以下url,下载模型列表(json格式)到指定目录三.解析上面的json文件、去重、批量下载模型配置文件(权重以外的文件) 一.在huggingface上创建AutoTrain项目 二.通过HF用…

Flutter中如何让Android的手势导航栏完全透明?

Flutter 开发中 安卓机器都有 像ios 的手势操作栏&#xff0c; 也就是屏幕底下的 那条线。 但这条线默认是有颜色的 &#xff08;像下面这样&#xff09; 一、全屏幕方式 void main() {// 全屏沉浸式SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []…

Vxe UI vxe-upload 上传组件,显示进度条的方法

vxe-upload 上传组件 查看官网 https://vxeui.com 显示进度条很简单&#xff0c;需要后台支持进度就可以了&#xff0c;后台实现逻辑具体可以百度&#xff0c;这里只介绍前端逻辑。 上传附件 相关参数说明&#xff0c;具体可以看文档&#xff1a; multiple 是否允许多选 li…

JDBC常见异常(4)—No suitable driver found for url

异常代码 表示Java程序在尝试连接到Oracle数据库时&#xff0c;没有找到合适的JDBC驱动程序。 java.sql.SQLException: No suitable driver found for jdbc:oracle:thin:localhost:1521:ORCL异常分析 根据异常的字面意思&#xff0c;大概可以分析原因 这通常是因为驱动程序…

FreeRTOS基础(四):静态创建任务

上一篇博客&#xff0c;我们讲解了FreeRTOS中如何动态创建任务&#xff0c;那么这一讲&#xff0c;我们从实战出发&#xff0c;规范我们在FreeRTOS下的编码风格&#xff0c;掌握静态创建任务的编码风格&#xff0c;达到实战应用&#xff01; 目录 一、空闲任务和空闲任务钩子…

【算法】位运算算法——消失的两个数字(困难)

题解&#xff1a;消失的两个数字(位运算算法) 目录 1.题目2.题解3.示例代码如下4.总结 1.题目 题目链接&#xff1a;LINK 2.题解 本题要求时间复杂度O(N),空间复杂度O(1),分别否了我们 排序遍历 和 哈希数组 的想法。想要在规定时间/空间复杂度内完成本题&#xff0c;需要借…

数据结构05:树与二叉树 习题02[C++]

考研笔记整理&#xff0c;本篇作为二叉树的入门习题&#xff0c;供小伙伴们参考~&#x1f95d;&#x1f95d; 之前的博文链接在此&#xff1a;数据结构05&#xff1a;树与二叉树[C]-CSDN博客~&#x1f95d;&#x1f95d; 第1版&#xff1a;王道书的课后习题~&#x1f9e9;&am…

基于多源土地覆盖产品整合的高精度中国森林覆盖数据集

本数据集是结合多源土地覆盖产品的一致性和互补性&#xff0c;基于无云合成影像并结合随机森林分类模型和多级投票策略生产的一套全国范围的高精度森林覆盖数据产品。该数据产品可以提升我国森林资源监测、林业经营管理、森林碳汇计量评价等方面工作的准确性&#xff0c;为森林…

什么洗地机口碑最好?目前口碑最好的十大洗地机品牌推荐

如今人们的生活节奏越来越快&#xff0c;休闲时间越来越少&#xff0c;下班之后还要腾出时间和精力打扫卫生&#xff0c;委实是耗神的事儿。这个时候&#xff0c;高科技的智能清洁家电产品便起到了重要作用了。洗地机集合扫地、吸尘、洗地为一体的清洁机器&#xff0c;能够快速…

【5】MySQL数据库备份-XtraBackup 安装报错 zstd

XtraBackup 安装报错 zstd 前言解决方案 前言 在 Linux 系统上安装 XtraBackup 过程中&#xff0c;遇到如下的报错&#xff08;… Requires: zstd …&#xff09;&#xff1a; --> Processing Dependency: zstd for package: percona-xtrabackup-80-8.0.35-30.1.el7.x86_…

pytorch-Normalization

目录 1. 为什么Normalization2. Normalization2.1 image Normalization2.2 Batch Normalization 3. Normalization pytorch实现3.1 Normalization标准公式3.2 2d normalization3.3 normalize test 4. 使用normalization的好处 1. 为什么Normalization 下图使用sigmoid激活函数…

在线考试教学系统平台系统源码/视频教学系统PHP源码/在线考试系统PHP源码

源码介绍 在线考试教学系统平台系统源码&#xff0c;视频教学系统PHP源码&#xff0c;在线考试系统PHP源码。 安装 1、部署好网站环境&#xff1a;php5.6mysql 2、将源码传至网站根目录&#xff0c;php源码用二进制上传&#xff0c;或者上传压缩包在空间解压 3、将“zztuk…

【PPT】修改新建文本框默认字体

【PPT】修改新建文本框默认字体

物联边缘网关有哪些功能?物联边缘网关在工业方向的应用-天拓四方

随着物联网技术的快速发展&#xff0c;越来越多的设备和系统正在接入到网络中&#xff0c;形成了一个庞大的智能生态系统。在这个系统中&#xff0c;物联边缘网关扮演着至关重要的角色&#xff0c;它不仅是连接设备和云端的桥梁&#xff0c;更是推动智能应用落地的关键。在当今…

【GD32】从零开始学GD32单片机高级篇——SDIO外设详解(GD32F470ZGT6)

目录 简介总线拓扑总线操作“无响应” 和 “无数据” 操作多块读写操作数据流读写操作 总线协议命令响应R1/R1b (普通命令响应)R2 (CID, CSD 寄存器)R3 (OCR 寄存器)R4 (Fast IO)R4b&#xff08;Fast IO&#xff09;R5 (中断请求)R5b&#xff08;中断请求&#xff09;R6 (发布的…