当前位置: 首页 > news >正文

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>

相关文章:

Wpf 使用 Prism 实战开发Day31

登录数据绑定 1.首先在LoginViewModel 登录逻辑处理类中&#xff0c;创建登录要绑定属性和命令 public class LoginViewModel : BindableBase, IDialogAware {public LoginViewModel(){ExecuteCommand new DelegateCommand<string>(Execure);}public string Title { ge…...

Linux权限提升二

#应用场景&#xff1a; 获取到Web权限或普通用户在Linux服务器上时进行的SUID&SUDO提权 SUID (Set owner User ID up on execution)是给予文件的一个特殊类型的文件权限。在Linux/Unix中&#xff0c;当一个程序运行的时候&#xff0c;程序将从登录用户处继承权限。SUID被定…...

[AI OpenAI] 推出ChatGPT Edu

一种负担得起的解决方案&#xff0c;帮助大学将AI负责任地引入校园。 我们宣布推出ChatGPT Edu&#xff0c;这是一个专为大学设计的ChatGPT版本&#xff0c;旨在负责任地向学生、教职员工、研究人员和校园运营部署AI。ChatGPT Edu由GPT-4o提供支持&#xff0c;能够跨文本和视觉…...

HTML5+CSS3回顾总结

一、HTML5新特性 1.语义化标签 <header> 头部标签<nav> 导航标签<article> 内容标签<section> 定义文档某个区域<aside> 侧边栏标签<footer> 尾部标签 2.多媒体标签 2.1视频标签vedio 》常规写法&#xff08;尽量都使用mp4&#xff0…...

AI推介-多模态视觉语言模型VLMs论文速览(arXiv方向):2024.05.01-2024.05.10

文章目录~ 1.Pseudo-Prompt Generating in Pre-trained Vision-Language Models for Multi-Label Medical Image Classification2.VLSM-Adapter: Finetuning Vision-Language Segmentation Efficiently with Lightweight Blocks3.Memory-Space Visual Prompting for Efficient …...

Python 点云生成高程模型图(DSM)

点云生成高程模型图 一、什么是DSM?二、python代码三、结果可视化一、什么是DSM? DSM(Digital Surface Model)是一种数字高程模型,通常用于描述地表地形的数字化表示。它是由一系列离散的高程数据点组成的三维地形模型,其中每个点都具有其相应的高程值。   DSM主要用于…...

[第五空间 2021]WebFTP

题目是WebFTP 通过标签可以看出git泄露(git泄露是指开发人员利用git进行版本控制) 通过网上了解WebFTP的源码账号admin 密码admin888 进去之后正常思路是我们利用/.git 在githack里面进行复现 查看log看看有没有flag 但是经过我们查询之后不是这样子 通过一段时间摸索在phpinf…...

SQL—DQL(数据查询语言)之小结

一、引言 在前面我们已经学习完了所有的关于DQL&#xff08;数据查询语言&#xff09;的基础语法块部分&#xff0c;现在对DQL语句所涉及的语法&#xff0c;以及需要注意的事项做一个简单的总结。 二、DQL语句 1、基础查询 注意&#xff1a; 基础查询的语法是&#xff1a;SELE…...

找回xmind文件办法:一切意外均可找回(误删/重启关机等)

我周三编辑完&#xff0c;周四下午评审完用例忘记保存 结果到了快乐星期五&#xff0c;由于是周五我太开心了...早上到公司后觉得电脑卡&#xff0c;直接点了重启啥都没保存啊啊啊啊啊 准备上传测试用例时才想起来我的用例找不见了&#xff01;&#xff01;&#xff01;&…...

微信小程序 npm构建+vant-weaap安装

微信小程序&#xff1a;工具-npm构建 报错 解决&#xff1a; 1、新建miniprogram文件后&#xff0c;直接进入到miniprogram目录&#xff0c;再次执行下面两个命令&#xff0c;然后再构建npm成功 npm init -y npm install express&#xff08;Node js后端Express开发&#xff…...

【LeetCode 63】 不同路径 II

1. 题目 2. 分析 这道题比较典型&#xff0c;跟最小路径和 是同样的思想。比较简单。 3. 代码 class Solution:def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:row len(obstacleGrid)col len(obstacleGrid[-1]) dp [[0] *(col) f…...

OpenAI助手API接入-问答对自动生成

支持GPT-3.5-Turbo, GPT-4o, GPT-4-Turbo import json import openai from pathlib import Path import os client openai.OpenAI(base_urlbase_url, api_keyapi_key) file client.files.create( fileopen("H3.pdf", "rb"), purposeassistants ) …...

9. C++通过epoll+fork的方式实现高性能网络服务器

epollfork 实现高性能网络服务器 一般在服务器上&#xff0c;CPU是多核的&#xff0c;上述epoll实现方式只使用了其中的一个核&#xff0c;造成了资源的大量浪费。因此我们可以将epoll和fork结合来实现更高性能的网络服务器。 创建子进程函数–fork( ) 要了解线程我们先来了解…...

【Mac】XMind for mac(XMind思维导图)v24.04.10311软件介绍和安装教程

软件介绍 XMind for Mac是一款功能强大的思维导图软件。它具有以下主要特点&#xff1a; 1.多样化的思维导图功能&#xff1a;XMind for Mac提供了丰富的思维导图编辑功能&#xff0c;用户可以创建各种类型的思维导图&#xff0c;包括组织结构图、逻辑图、时间轴图等&#xf…...

使用 Django ORM 进行数据库操作

文章目录 创建Django项目和应用定义模型查询数据更新和删除数据总结与进阶聚合和注解跨模型查询原始SQL查询 Django是一个流行的Web应用程序框架&#xff0c;它提供了一个强大且易于使用的对象关系映射&#xff08;ORM&#xff09;工具&#xff0c;用于与数据库进行交互。在本文…...

行为型设计模式之模板模式

文章目录 概述原理结构图实现 小结 概述 模板方法模式(template method pattern)原始定义是&#xff1a;在操作中定义算法的框架&#xff0c;将一些步骤推迟到子类中。模板方法让子类在不改变算法结构的情况下重新定义算法的某些步骤。 模板方法中的算法可以理解为广义上的业…...

大泽动力车载柴油发电机的特点和优势有哪些

大泽动力车载柴油发电机具有一系列显著的特点和优势&#xff0c;以下是对其的详细介绍&#xff1a; 低噪音性能&#xff1a;大泽动力车载柴油发电机具备明显的低噪音性能&#xff0c;其噪音限值在距离机组7米处测得为70dB(A)&#xff0c;这为用户提供了一个相对安静的工作环境…...

基于 IP 的 DDOS 攻击实验

一、介绍 基于IP的分布式拒绝服务&#xff08;Distributed Denial of Service, DDoS&#xff09;攻击是一种利用大量受控设备&#xff08;通常是僵尸网络&#xff09;向目标系统发送大量请求或数据包&#xff0c;以耗尽目标系统的资源&#xff0c;导致其无法正常提供服务的攻击…...

GPT-4o如何重塑AI未来!

如何评价GPT-4o? 简介&#xff1a;最近&#xff0c;GPT-4o横空出世。对GPT-4o这一人工智能技术进行评价&#xff0c;包括版本间的对比分析、GPT-4o的技术能力以及个人感受等。 GPT-4o似乎是一个针对GPT-4模型进行优化的版本&#xff0c;它在性能、准确性、资源效率以及安全和…...

window本地域名映射修改

位置 C:\Windows\System32\drivers\etc 文件名 hosts 修改方法 复制一份到桌面 修改桌面的文件 # 前面为ip 后面为域名&#xff0c;域名-》ip的映射 127.0.0.1 link.com最后将修改后的文件保存&#xff0c;复制到C:\Windows\System32\drivers\etc替换...

如何彻底解决C盘空间不足:Windows Cleaner终极清理指南

如何彻底解决C盘空间不足&#xff1a;Windows Cleaner终极清理指南 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服&#xff01; 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你是否经常遇到C盘空间不足的困扰&#xff1f;…...

从源头到治理:光伏并网逆变器直流分量抑制技术全解析

1. 光伏并网逆变器直流分量问题概述 第一次在光伏电站现场看到直流分量超标告警时&#xff0c;我盯着监控屏幕愣了半天。作为从业多年的光伏系统工程师&#xff0c;我深知这个看似微小的技术指标背后隐藏着多大的隐患。直流分量就像电网中的"隐形杀手"&#xff0c;它…...

Arm SVE指令集详解:条件选择与向量操作优化

1. SVE指令集概述与背景SVE&#xff08;Scalable Vector Extension&#xff09;是Arm架构中的可扩展向量指令集扩展&#xff0c;它为高性能计算和数据密集型应用提供了强大的并行处理能力。与传统SIMD指令集不同&#xff0c;SVE的最大特点是其向量长度不可知&#xff08;Vector…...

告别wx.startRecord!微信小程序录音功能保姆级教程(RecorderManager全解析)

微信小程序录音功能深度重构指南&#xff1a;从wx.startRecord到RecorderManager的完整迁移方案 在微信小程序开发生态中&#xff0c;音频处理能力一直是实现丰富交互体验的核心组件之一。随着技术架构的持续优化&#xff0c;微信团队对录音API进行了重大升级&#xff0c;用更现…...

如何高效配置跨平台网盘直链解析工具:技术实现与实战指南

如何高效配置跨平台网盘直链解析工具&#xff1a;技术实现与实战指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天…...

NotebookLM引用格式生成失效真相:Google官方未公开的citation token截断限制(含绕过验证方案)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;NotebookLM引用格式生成失效真相&#xff1a;Google官方未公开的citation token截断限制&#xff08;含绕过验证方案&#xff09; NotebookLM 在处理长篇 PDF 或网页源时&#xff0c;常出现引用标记&am…...

避坑指南:为什么你的Realsense D435i视频流用VLC/EasyPlayer打不开?RTSP回传思翼MK15E的正确姿势

深度解析&#xff1a;Realsense D435i视频流RTSP传输的兼容性陷阱与实战解决方案 当你在无人机项目中尝试通过RTSP协议传输Realsense D435i的实时视频流时&#xff0c;是否遇到过VLC或EasyPlayer无法正常播放的困扰&#xff1f;这种看似简单的视频流传输背后&#xff0c;隐藏着…...

从莎士比亚到鲁迅,NotebookLM辅助文学研究全流程,深度拆解7类文本生成陷阱与规避方案

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;NotebookLM在文学研究中的范式革命 传统文学研究长期依赖人工细读、索引比对与跨文本联想&#xff0c;耗时且易受主观经验局限。NotebookLM 以“源文档优先”&#xff08;source-first&#xff09;架构重构人…...

编程分析企业奖罚制度执行数据,优化奖罚标准,做到赏罚分明,调动全体员工职场工作积极性。

定位是&#xff1a;商务智能&#xff08;BI&#xff09; Python 人力资源数据分析&#xff0c;可直接用于课程设计、技术博客或企业内部管理优化原型。⚠️ 说明&#xff1a;本方案不评价企业文化优劣、不站队劳资任何一方&#xff0c;仅提供数据建模与分析框架。一、实际应用…...

别再被Nginx的rewrite循环搞懵了!一个真实Vue项目部署的500错误排查实录

从Nginx重定向死循环到优雅解决&#xff1a;Vue项目部署的深度排错指南 凌晨三点&#xff0c;服务器监控突然告警——刚上线的Vue企业门户网站出现大面积500错误。查看日志时&#xff0c;那个令人窒息的rewrite or internal redirection cycle错误信息让整个运维团队陷入沉思。…...