WPF实战学习笔记29-登录数据绑定,编写登录服务
添加登录绑定字段、命令、方法
修改对象:Mytodo.ViewModels.ViewModels
using Mytodo.Service;
using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Services.Dialogs;
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Shapes;namespace Mytodo.ViewModels
{public class LoginViewModel : BindableBase, IDialogAware{#region 定义命令/// <summary>/// 执行登录|推出等相关命令/// </summary>public DelegateCommand<string> ExecuteCommand { get; set; }#endregion#region 定义属性public string Password{get { return password; }set { password = value; }}public string Account{get { return account; }set { account = value; }}#endregion#region 定义重要字段#endregion#region 定义普通字段private string password;private string account;private readonly ILoginService loginService;private readonly IEventAggregator aggregator;#endregion#region 命令方法/// <summary>/// ExecuteCommand对应的方法/// </summary>/// <param name="obj"></param>private void Execute(string obj){switch (obj){case "Login": Login(); break;case "LoginOut": LoginOut(); break;//case "Resgiter": Resgiter(); break;//case "ResgiterPage": SelectIndex = 1; break;//case "Return": SelectIndex = 0; break;}}private void LoginOut(){//if (string.IsNullOrWhiteSpace(UserName) ||// string.IsNullOrWhiteSpace(PassWord))//{// return;//}//var loginResult = await LoginService.Login(new Shared.Dtos.UserDto()//{// Account = UserName,// PassWord = PassWord//});//if (loginResult != null && loginResult.Status)//{// RequestClose?.Invoke(new DialogResult(ButtonResult.OK));//}//else//{// //登录失败提示...// aggregator.SendMessage(loginResult.Message, "Login");//}}private void Login(){//throw new NotImplementedException();}#endregion#region 启动项#endregion#region 继承public string Title { get; set; } = "Todo";public event Action<IDialogResult> RequestClose;public bool CanCloseDialog(){return true;}public void OnDialogClosed(){LoginOut();}public void OnDialogOpened(IDialogParameters parameters){}#endregionpublic LoginViewModel(ILoginService loginService, IEventAggregator aggregator){ExecuteCommand = new DelegateCommand<string> (Execute);this.loginService = loginService;this.aggregator = aggregator;}}
}
添加密码依赖对象行为
添加文件:Mytodo.Extensions.PassWordExtensions
using Microsoft.Xaml.Behaviors;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;namespace Mytodo.Extensions
{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 PassWord. This enables animation, styling, binding, etc...public static readonly DependencyProperty PassWordProperty =DependencyProperty.RegisterAttached("PassWord", typeof(string), typeof(PassWordExtensions), new FrameworkPropertyMetadata(string.Empty, OnPassWordPropertyChanged));private static void OnPassWordPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e){var passWord = d as PasswordBox;string password = (string)e.NewValue;if (passWord != null && passWord.Password != password)passWord.Password = password;}}public class PasswordBehavior : Behavior<PasswordBox>{protected override void OnAttached(){base.OnAttached();AssociatedObject.PasswordChanged += AssociatedObject_PasswordChanged;}private void AssociatedObject_PasswordChanged(object sender, RoutedEventArgs e){PasswordBox passwordBox = sender as PasswordBox;string password = PassWordExtensions.GetPassWord(passwordBox);if (passwordBox != null && passwordBox.Password != password)PassWordExtensions.SetPassWord(passwordBox, passwordBox.Password);}protected override void OnDetaching(){base.OnDetaching();AssociatedObject.PasswordChanged -= AssociatedObject_PasswordChanged;}}
}
### 登录UI添加密码行为
修改文件:Mytodo.Views.LoginView.xmal
- 添加命名空间,略
- 修改passbox。
<PasswordBoxMargin="0,10"md:HintAssist.Hint="请输入密码"pass:PassWordExtensions.PassWord="{Binding Password, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"DockPanel.Dock="Top"><i:Interaction.Behaviors><pass:PasswordBehavior /></i:Interaction.Behaviors>
</PasswordBox>
添加加密方法,并使用
添加文件:MyToDo.Share.StringExtensions.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;namespace MyToDo.Share
{public static class StringExtensions{public static string GetMD5(this string data){if (string.IsNullOrWhiteSpace(data))throw new ArgumentNullException(nameof(data));var hash = MD5.Create().ComputeHash(Encoding.Default.GetBytes(data));return Convert.ToBase64String(hash);//将加密后的字节数组转换为加密字符串}}
}
客户端添加登录和注册接口
添加文件:Mytodo.Service.cs
using MyToDo.Share.Models;
using MyToDo.Share;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Mytodo.Service
{public interface ILoginService{Task<ApiResponse> Login(UserDto user);Task<ApiResponse> Resgiter(UserDto user);}
}
添加文件:Mytodo.Service.LoginService
using MyToDo.Share;
using MyToDo.Share.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Mytodo.Service
{public class LoginService : ILoginService{private readonly HttpRestClient client;private readonly string serviceName = "Login";public LoginService(HttpRestClient client){this.client = client;}public async Task<ApiResponse> Login(UserDto user){BaseRequest request = new BaseRequest();request.Method = RestSharp.Method.POST;request.Route = $"api/{serviceName}/Login";request.Parameter = user;return await client.ExecuteAsync(request);}public async Task<ApiResponse> Resgiter(UserDto user){BaseRequest request = new BaseRequest();request.Method = RestSharp.Method.POST;request.Route = $"api/{serviceName}/Resgiter";request.Parameter = user;return await client.ExecuteAsync(request);}}
}
注册接口和服务
Mytodo.app.xaml.cs 添加内容containerRegistry.Register<ILoginService, LoginService>();
相关文章:
![](https://www.ngui.cc/images/no-images.jpg)
WPF实战学习笔记29-登录数据绑定,编写登录服务
添加登录绑定字段、命令、方法 修改对象:Mytodo.ViewModels.ViewModels using Mytodo.Service; using Prism.Commands; using Prism.Events; using Prism.Mvvm; using Prism.Services.Dialogs; using System; using System.CodeDom.Compiler; using System.Collec…...
![](https://www.ngui.cc/images/no-images.jpg)
c++函数式编程:统计文件字符串,文件流
头文件 #include <iostream> #include <fstream> #include <string> #include <sstream> #include <algorithm> #include <vector>统计方法 int count_lines(const std::string &filename) {std::ifstream in{filename};return std:…...
![](https://www.ngui.cc/images/no-images.jpg)
scp命令----跨服务器传输文件
scp命令 Linux scp 命令用于 Linux 之间复制文件和目录。 scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。 scp 是加密的,rcp 是不加密的,scp 是 rcp 的加强版。 一、Linux scp 命令 以下是scp命令常用的…...
![](https://img-blog.csdnimg.cn/d890c858afd64ba595a81c831defdb55.png)
React Dva项目中模仿网络请求数据方法
我们都已经选择react了 那么自然是一个前后端分离的开发形式 至少我在公司中 大部分时候是前后端同时开发的 一般你在开发界面没有接口直接给你 但你可以和后端约定数据格式 然后在前端模拟数据 我们在自己的Dva项目中 在根目录下的 mock 目录下创建一个js文件 我这里叫 filmDa…...
![](https://img-blog.csdnimg.cn/522c8805ffe3470ea357a242882fb55c.png)
【云原生】Docker容器命令监控+Prometheus监控平台
目录 1.常用命令监控 docker ps docker top docker stats 2.weave scope 1.下载 2.安装 3.访问查询即可 3.Prometheus监控平台 1.部署数据收集器cadvisor 2.部署Prometheus 3.部署可视化平台Gragana 4.进入后台控制台 1.常用命令监控 docker ps [rootlocalhost ~…...
![](https://www.ngui.cc/images/no-images.jpg)
DBA 职责及日常工作职责
DBA 职责及日常工作职责: 1.安装和升级数据库服务器,以及应用程序工具构建和配置网络环境. 2.熟悉数据库系统的存储结构预测未来的存储需求,制订数据库的存储方案. 3.根据开发人员设计的应用系统需求创建数据库存储结构. 4.根据开发人员设计的应用系统需求创建数据库对象 5…...
![](https://www.ngui.cc/images/no-images.jpg)
如何利用量化接口进行数据分析和计算?
量化交易作为一种利用数据和算法进行投资的方式,数据分析和计算是量化交易的核心。量化接口作为连接量化交易者和交易所的桥梁,提供了获取市场数据和执行交易指令的功能,为量化交易的数据分析和计算提供了基础。 一、数据获取: 市…...
![](https://img-blog.csdnimg.cn/f51a18433e3844e08b37f3c52db07959.png)
electron-egg 加密报错
electron框架:electron-egg 解决方式 npm uninstall bytenode npm install bytenode1.3.6node:internal/modules/cjs/loader:928 throw err; ^ Error: Cannot find module ‘node:assert/strict’ Require stack: D:\electron-egg-test\new-electron-egg\electr…...
![](https://www.ngui.cc/images/no-images.jpg)
循环队列的基本操作(3种处理方式,2种实现方式)
为区分队空队满有3种处理方式: ①牺牲一个单元 ②增设表示元素个数的数据成员 ③增设tag数据成员 1.front->队头元素,rear->队尾元素下一位置 1.1牺牲一个单元 1.1.1定义 #define MaxSize 50 typedef struct {ElemType data[MaxSize];int fron…...
![](https://www.ngui.cc/images/no-images.jpg)
react的特点
React的特点包括以下几个方面: 组件化:React将用户界面分解成小而独立的组件,每个组件都有自己的状态和属性。通过组合这些组件,可以构建复杂而灵活的用户界面。 虚拟DOM:React使用虚拟DOM(Virtual DOM&am…...
![](https://www.ngui.cc/images/no-images.jpg)
MATLAB实现图像处理:图像识别、去雨、去雾、去噪、去模糊等等(附上20个完整仿真源码)
图像处理是计算机视觉领域的重要研究方向,MATLAB是一种功能强大的数学计算软件,可以用于图像处理和分析。下面是一些简单的MATLAB图像处理代码示例,包括图像增强、边缘检测、形态学处理、特征提取等。 文章目录 1. 图像增强2. 边缘检测3. 形态…...
![](https://www.ngui.cc/images/no-images.jpg)
cmake stm32 模板
文件结构 ├─.vscode ├─build ├─cmake ├─Drivers │ ├─CMSIS │ │ ├─Device │ │ │ └─ST │ │ │ └─STM32F1xx │ │ │ ├─Include │ │ │ └─Source │ │ │ └─Templates │ │ └─Include │ └─STM32F1xx_HAL_Driver │ ├─Inc │ │ └─Leg…...
![](https://img-blog.csdnimg.cn/img_convert/32fd98aad88082cde6cc40c7e484c47b.png)
STM32 UDS Bootloader开发-上位机篇-CANoe制作(2)
文章目录 前言CANoe增加NodeCAPL脚本获取GUI中的参数刷写过程诊断仪在线接收回调函数发送函数总结前言 在上一篇文章中,介绍了UDS Bootloadaer上位机软件基于CANoe的界面设计。本文继续介绍CAPL脚本的编写以实现刷写过程。 CANoe增加Node 在开始编写CAPL之前,需要在Simula…...
![](https://img-blog.csdnimg.cn/afba942427b64fdfaedc68b4f89e43c8.png)
实例026 随机更换主界面背景
实例说明 如果开发的软件用户使用频率非常高,可以为程序设计随机更换背景的程序。这样不但可以使用户心情愉快,也增加了软件的人性化设计。下面的界面就是一个随机更换主界面的例子,效果如图1.26所示。 技术要点 随机更换主界面背景使用了…...
![](https://img-blog.csdnimg.cn/409481ec420c4400b46c91229874a079.png)
PostgreSQL 简洁、使用、正排索引与倒排索引、空间搜索、用户与角色
PostgreSQL使用 PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS),在灵活的BSD许可证下发行。PostgreSQL 9.0 :支持64位windows系统,异步流数据复制、Hot Standby;生产环境主流的版本是PostgreSQL 12 BSD协议 与 GPL协议 …...
![](https://www.ngui.cc/images/no-images.jpg)
querySubObject(“Cells(int,int)“, j,i)->property(“Value“)读不到数据问题
在使用qt读取Excel文件内容的时候,使用下列方式: worksheet->querySubObject("Cells(int,int)", j,i)->property("Value").toString(); 不会报错,但读取不到数据。多次尝试发现应该将property改为dynamicCall 下…...
![](https://img-blog.csdnimg.cn/8910218441294398ac630a6f06aea85c.png)
AutoSAR系列讲解(实践篇)10.2-EcuM的上下电流程
目录 一、上电(StartUp) 二、下电(Shutdown) 三、睡眠(Sleep) 上下电,说白了就是给Ecu上下电后,Ecu的代码执行顺序。这里还讲到了大家可能经常会用到的Sleep流程,主要就是可以归纳为以下这张图,大家 掌握这张图就基本掌握了EcuM的上下电流程了。这张图的具体内容博…...
![](https://img-blog.csdnimg.cn/img_convert/001744e0c2d5e4e7eaf647ba1f9bf84e.jpeg)
科研院所用泛微搭建信创办公平台,统一办公,业务融合,安全便捷
国家全面推动重要领域的信创改造工作,要求到2027年底,对综合办公、经营管理、生产运营等系统实现“应替尽替、能替则替”。 科研机构作为智力、知识密集型机构,承载着大量数据、信息资产,数字化程度高,业务系统多样&a…...
![](https://img-blog.csdnimg.cn/d2eb12fbb0f54a2e84d7b3c2ce35c3f3.png)
基于LoRA进行Stable Diffusion的微调
文章目录 基于LoRA进行Stable Diffusion的微调数据集模型下载环境配置微调过程 推理WebUI部署 基于LoRA进行Stable Diffusion的微调 数据集 本次微调使用的数据集为: LambdaLabs的Pokemon数据集 使用git clone命令下载数据集 git clone https://huggingface.co/…...
![](https://img-blog.csdnimg.cn/ddb09a56858b4da6beecded65e5537e2.png)
C++STL序列式容器——list容器及其常用操作(详解)
纵有疾风起,人生不言弃。本文篇幅较长,如有错误请不吝赐教,感谢支持。 💬文章目录 一.list容器基本概念二.list容器的常用操作list构造函数list迭代器获取list特性操作list元素操作list赋值操作list的交换、反转、排序、归并操作…...
![](https://img-blog.csdnimg.cn/72178b50eab84c699ff3566e4609e3f4.gif#pic_center)
【雕爷学编程】MicroPython动手做(15)——掌控板之AB按键2
知识点:什么是掌控板? 掌控板是一块普及STEAM创客教育、人工智能教育、机器人编程教育的开源智能硬件。它集成ESP-32高性能双核芯片,支持WiFi和蓝牙双模通信,可作为物联网节点,实现物联网应用。同时掌控板上集成了OLED…...
![](https://img-blog.csdnimg.cn/img_convert/5ba02c2591024aec814439044b9d0251.png)
Spring Boot中整合MyBatis(基于xml方式基于注解实现方式)
一、前提准备 在Spring Boot中整合MyBatis时,你需要导入JDBC(不需要手动添加)和Druid的相关依赖。 JDBC依赖:在Spring Boot中整合MyBatis时,并不需要显式地添加JDBC的包依赖。这是因为,当你添加mybatis-sp…...
![](https://img-blog.csdnimg.cn/2370dfb913134338b41e0834a29cc714.png)
ChatGPT漫谈(三)
AIGC(AI Generated Content)指的是使用人工智能技术生成的内容,包括文字、图像、视频等多种形式。通过机器学习、深度学习等技术,AI系统可以学习和模仿人类的创作风格和思维模式,自动生成大量高质量的内容。AIGC被视为继用户生成内容(UGC)和专业生成内容(PGC)之后的下…...
![](https://img-blog.csdnimg.cn/7b70acf060b64500b4585abe67eaaf7f.png#pic_center)
树、二叉树(C语言版)详解
🍕博客主页:️自信不孤单 🍬文章专栏:数据结构与算法 🍚代码仓库:破浪晓梦 🍭欢迎关注:欢迎大家点赞收藏关注 文章目录 🍊树的概念及结构1. 树的概念2. 树的相关概念3.树…...
![](https://img-blog.csdnimg.cn/98424efd19a14d76a3b25c33dcd834b3.png)
vue中Cascader 级联选择器实现-修改实现
vue 的cascader研究了好长时间,看了官网给的示例,上网查找了好多信息,才解决修改时回显的问题,现将方法总结如下: vue代码: <el-form-item label"芯片" prop"firmware"> <…...
![](https://img-blog.csdnimg.cn/bcb2e9957d7340bca150a7d53f01f07a.png)
C语言实现三子棋游戏
test.c源文件 - 三子棋游戏测试 game.h头文件 - 三子棋游戏函数的声明 game.c源文件 - 三子棋游戏函数的实现 主函数源文件: #define _CRT_SECURE_NO_WARNINGS 1#include"game.h" //自己定义的用"" void menu() {printf("*************…...
![](https://img-blog.csdnimg.cn/e627948a5e3e414bb882a6521f3354b0.png)
机器学习深度学习——softmax回归从零开始实现
👨🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——向量求导问题 📚订阅专栏:机器学习&&深度学习 希望文章对你们有所帮助 …...
![](https://img-blog.csdnimg.cn/d77b6a5ae91a4701aaff36055f039696.png)
Windows如何安装Django及如何创建项目
目录 1、Windows安装Django--pip命令行 2、创建项目 2.1、终端创建项目 2.2、在Pycharm中创建项目 2.3、二者创建的项目有何不同 2.4、项目目录说明 1、Windows安装Django--pip命令行 安装Django有两种方式: pip命令行【推荐--简单】手动安装【稍微复杂一丢丢…...
![](https://www.ngui.cc/images/no-images.jpg)
在CSDN学Golang云原生(监控解决方案Prometheus)
一,记录规则配置 在golang云原生中,通常使用日志库记录应用程序的日志。其中比较常见的有logrus、zap等日志库。这些库一般支持自定义的输出格式和级别,可以根据需要进行配置。 对于云原生应用程序,我们通常会采用容器化技术将其…...
![](https://img-blog.csdnimg.cn/8542585286e24ee5a54edac19c04e964.png)
双重for循环优化
项目中有段代码逻辑是个双重for循环,发现数据量大的时候,直接导致数据接口响应超时,这里记录下不断优化的过程,算是抛砖引玉吧~ Talk is cheap,show me your code! 双重for循环优化 1、数据准备2、原始双重for循环3、…...
![](http://terrylee.cnblogs.com/Images/OutliningIndicators/None.gif)
那个网站可以免费做风面/百度推广四川成都地区服务中心
摘要:在前一篇文章中我们并没有考虑配置的组件参数是什么类型,也没有在配置文件中指定过类型,那么Castle IOC是如何进行类型转换的?如何配置一些复杂的数据类型?如果有自定义的类型如何去进行类型转换?本文…...
![](/images/no-images.jpg)
做网站的费用怎么做账/百度云搜索引擎入口 百度网盘
在web工程中,jsp页面上的请求时要进行字符编码转换的 通常在web。xml中添加过滤器作用是把request对象中的头信息参数等等进行编码转换 然后继续后续过滤链。web。xml加入 (尽可能考前排放 过滤器是有顺序的)Set Character Encodinglter。SetCharacterEncodingFilte…...
![](/images/no-images.jpg)
成都最新疫情发布/seo推广专员招聘
1093 字符串AB (20 分) 题目链接 算法分析 依次遍历两个字符串,用on数组标记是否输出过 值为1表示输出过,值为0表示没有输出过. 代码实现 #include<bits/stdc.h> using namespace std; #define N 150 int on[N]; int main(){string a, b;getline(cin, a);getline(ci…...
![](/images/no-images.jpg)
如何编辑网页/郑州seo技术博客
创建(进入)VLAN10[SwitchA]vlan 102. 将E0/1加入到VLAN10[SwitchA-vlan10]port Ethernet 0/1 Ethernet 0/2 GigabitEthernet 1/13. 配置VLAN10内的端口隔离[SwitchA-vlan10]port-isolate enable4. 将连接服务器的端口配置为隔离端口的上行端口[SwitchA]i…...
![](/images/no-images.jpg)
wordpress $show_date/友情链接交易购买
最近在做一个项目,其中用到了TabActivity,想截取OnKeyDown事件来提示用户退出程序在api lever 5以上有OnBackPressed重载函数,可以达到同样的效果。 但是我一直没有成功,调试程序发现,因为TabActivity压根没有获取我按…...
![](https://img-blog.csdnimg.cn/011ac44a31754607a9db9d57388db44f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA6IOW5ZOl546L6ICB5biI,size_8,color_FFFFFF,t_70,g_se,x_16#pic_center)
上海做网站的公司电话/seo专家招聘
前文回顾 《物联网系统RT-Thread学习—开发环境搭建》 《物联网系统RT-Thread学习—内核学习》 本集预告 本次来介绍一下RTT下面的IO设备驱动开发。具体内容可以学习官方文档,内容完备,并附带例子程序 I/O设备模型 这里就不再去复制粘贴了࿰…...