58.界面参数传递给Command C#例子 WPF例子

界面参数的传递,界面参数是如何从前台传送到后台的。

param 参数是从界面传递到命令的。这个过程通常涉及以下几个步骤:

  1. 数据绑定:界面元素(如按钮)的 Command 属性绑定到视图模型中的 RelayCommand 实例。同时,界面元素的 CommandParameter 属性(如果有的话)可以绑定到视图模型中的某个属性或直接设置为一个静态值。这个 CommandParameter 就是传递给 RelayCommand 的 param 参数。

  2. 命令触发:当用户与界面元素交互(例如点击按钮)时,会触发绑定的命令。WPF 框架会调用命令的 Execute 方法(如果命令可执行)或 CanExecute 方法(以检查命令是否可执行)。

  3. 参数传递:在命令触发时,CommandParameter 的值被传递给命令的 Execute 和 CanExecute 方法作为 param 参数

  4. 参数使用:在 RelayCommand 的 lambda 表达式中,param 被转换为 ViewModel 类型(这里假设传递的参数实际上是 ViewModel 类型的实例或可以安全地转换为 ViewModel 类型)。然后,这个转换后的 ViewModel 实例被传递给 SaveUser 方法或 IsUserSaveEnabled 方法。

  5. 属性访问:在 SaveUser 或 IsUserSaveEnabled 方法中,就可以安全地访问 ViewModel 实例的属性,如 UserName。由于这些方法接收的是已经转换为正确类型的 ViewModel 实例,因此可以直接读取其属性。

一开始无法点击登录

然后点击账户历史自动填入

填入其他内容后再点击登录,账户历史会更新

ViewModel代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;

namespace Icommand练习
{
    class ViewModel:INotifyPropertyChanged
    {


        private string _userName;
        public string UserName
        {
            get { return _userName; }
            set { _userName = value; OnPropertyChanged(nameof(UserName)); }
        }

        private string _email;
        public string Email
        {
            get { return _email; }
            set { _email = value; OnPropertyChanged(nameof(Email)); }
        }

        private string _tempUserName;
        public string TempUserName
        {
            get { return _tempUserName; }
            set { _tempUserName = value; }
        }
        private string _tempEmail;
        public string TempEmail
        {
            get { return _tempEmail; }
            set { _tempEmail = value; }
        }



        public ICommand SaveCommand { get; private set; }

        public ViewModel()
        {
            SaveCommand = new RelayCommand(param => SaveUser((ViewModel)param), param => IsUserSaveEnabled((ViewModel)param));
            Button2Command=new RelayCommand(param => Button2Click(), param=>true);
            this.TempUserName = "网易";
            this.TempEmail = "123456@163.com";
        }

        private void SaveUser(ViewModel user)
        {
            // 在这里实现保存用户的逻辑,比如调用API或保存到数据库
            // 这里只是简单打印用户信息
            MessageBox.Show($"Saving user: UserName={user.UserName}, Email={user.Email}");
            user.TempUserName = _userName;
            user.TempEmail = _email;

        }

        private bool IsUserSaveEnabled(ViewModel viewModel)
        {
            if (viewModel == null)
            {
                // 如果 param 不是 ViewModel 类型或者为 null,则返回 false
                return false;
            }

            // 现在可以安全地访问 viewModel.UserName
            return !string.IsNullOrEmpty(viewModel.UserName);
        }


        public ICommand Button2Command {  get; }



        public void Button2Click()
        {
            UserName = TempUserName;
            Email = TempEmail;
        }








        //固定
        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

    }

    //public class RelayCommand : ICommand
    //{
    //    private readonly Action<object> _execute;
    //    public event EventHandler CanExecuteChanged;

    //    public RelayCommand(Action<object> execute) => _execute = execute;

    //    public bool CanExecute(object parameter) => true; // 总是可执行(简化)
    //    public void Execute(object parameter) => _execute(parameter);
    //}

    public class RelayCommand : ICommand
    {
        private readonly Action<object> _execute;
        private readonly Func<object, bool> _canExecute;

        public RelayCommand(Action<object> execute, Func<object, bool> canExecute = null)
        {
            _execute = execute ?? throw new ArgumentNullException(nameof(execute));
            _canExecute = canExecute;
        }

        public bool CanExecute(object parameter)
        {
            return _canExecute == null || _canExecute(parameter);
        }

        public void Execute(object parameter)
        {
            _execute(parameter);
        }

        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }

        // 可以在这里添加额外的逻辑来处理 CanExecuteChanged 事件的触发,但上面的实现已经足够用于大多数场景。
    }

}

XAMl代码:

<Window x:Class="Icommand练习.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:Icommand练习"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <StackPanel>
        <TextBox Text="{Binding UserName, UpdateSourceTrigger=PropertyChanged}" />
        <TextBox Text="{Binding Email, UpdateSourceTrigger=PropertyChanged}" />
        <Button Content="登录" Command="{Binding SaveCommand}" CommandParameter="{Binding}" />
        <Button Command="{Binding Button2Command}" Content="账户历史"/>
    </StackPanel>
</Window>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Julius AI 人工智能数据分析工具介绍

Julius AI 是一款由 Casera Labs 开发的人工智能数据分析工具&#xff0c;旨在通过自然语言交互和强大的算法能力&#xff0c;帮助用户快速分析和可视化复杂数据。这款工具特别适合没有数据科学背景的用户&#xff0c;使数据分析变得简单高效。 核心功能 自然语言交互&#x…

【JavaEE进阶】应用分层

目录 &#x1f38b;序言 &#x1f343;什么是应用分层 &#x1f38d;为什么需要应用分层 &#x1f340;如何分层(三层架构) &#x1f384;MVC和三层架构的区别和联系 &#x1f333;什么是高内聚低耦合 &#x1f38b;序言 通过上⾯的练习,我们学习了SpringMVC简单功能的开…

在 Ubuntu22.04 上安装 Splunk

ELK感觉太麻烦了&#xff0c;换个日志收集工具 Splunk 是一种 IT 工具&#xff0c;可帮助在任何设备上收集日志、分析、可视化、审计和创建报告。简单来说&#xff0c;它将“机器生成的数据转换为人类可读的数据”。它支持从虚拟机、网络设备、防火墙、基于 Unix 和基于 Windo…

ES设置证书和创建用户,kibana连接es

1、启动好es 2、进入es容器 docker exec -it es /bin/bash 3、生成ca证书 ./bin/elasticsearch-certutil ca 注&#xff1a;两个红方框位置直接回车 4、生成cert证书 ./bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12 注&#xff1a;前两个红框直接回车&am…

python + ollama 手敲实现私有大模型知识库

在不依赖 LangChain、LlamaIndex 等框架&#xff0c;以及各种知识问答软件的情况下&#xff0c;尽量减少第三方库的使用&#xff0c;仅通过 Ollama 和 NumPy 两个外部库来实现 RAG&#xff08;Retrieval-Augmented Generation&#xff09;应用。 一、安装python 下载&#xf…

TypeScript中的函数:类型安全与高级特性

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

EasyExcel使用详解

文章目录 EasyExcel使用详解一、引言二、环境准备与基础配置1、添加依赖2、定义实体类 三、Excel 读取详解1、基础读取2、自定义监听器3、多 Sheet 处理 四、Excel 写入详解1、基础写入2、动态列与复杂表头3、样式与模板填充 五、总结 EasyExcel使用详解 一、引言 EasyExcel 是…

概率论里的特征函数,如何用卷积定理去理解

概率论里的特征函数&#xff0c;如何用卷积定理去理解_哔哩哔哩_bilibili

具身智能技术趋势

参考&#xff1a; 【北京大学-董豪】具身智能技术趋势分析 2024.8 回答了具身智能技术G3、G4的必要性&#xff0c;以及真实数据、仿真数据、互联网数据之间的关系 具身智能趋势 趋势&#xff1a;寻求一个通用路径实现所有的上肢操作 要求&#xff1a;① 低成本 ② 拓展到所有…

新型智慧城市解决方案-3

智慧城市概述 智慧城市是运用物联网、云计算、大数据等现代科技手段&#xff0c;构建集网络化、信息化、智能化于一体的新型城市模式&#xff0c;涵盖智慧管理、智慧产业、智慧民生等核心内容。 智慧城市建设背景 随着城镇化快速发展&#xff0c;城市病问题日益突出&#x…

【云安全】云原生-K8S-搭建/安装/部署

一、准备3台虚拟机 务必保证3台是同样的操作系统&#xff01; 1、我这里原有1台centos7&#xff0c;为了节省资源和效率&#xff0c;打算通过“创建链接克隆”2台出来 2、克隆之前&#xff0c;先看一下是否存在k8s相关组件&#xff0c;或者docker相关组件 3、卸载原有的docker …

C++的类Class

文章目录 一、C的struct和C的类的区别二、关于OOP三、举例&#xff1a;一个商品类CGoods四、构造函数和析构函数1、定义一个顺序栈2、用构造和析构代替s.init(5);和s.release();3、在不同内存区域构造对象4、深拷贝和浅拷贝5、构造函数和深拷贝的简单应用6、构造函数的初始化列…

HTML<kbd>标签

例子 在文档中将一些文本定义为键盘输入&#xff1a; <p>Press <kbd>Ctrl</kbd> <kbd>C</kbd> to copy text (Windows).</p> <p>Press <kbd>Cmd</kbd> <kbd>C</kbd> to copy text (Mac OS).</p>…

windows下部署安装 ELK,nginx,tomcat日志分析

1.安装包 如上就是elk- windows下部署需要用到的安装包 &#xff08;ps:注意版本需要对应&#xff0c;另外es7版本对应是 jdk8&#xff0c;若更高版本 请自行查询版本对应号&#xff09;。 下载地址&#xff1a; Past Releases of Elastic Stack Software | Elastic 此地址可…

Controller 层优化四步曲

Controller 层优化四步曲 前言 在开发过程中&#xff0c;Controller 层作为系统与外界交互的桥梁&#xff0c;承担着接收请求、解析参数、调用业务逻辑、处理异常等职责。 然而&#xff0c;随着业务复杂度的增加&#xff0c;Controller 层的代码往往会变得臃肿且难以维护。 …

CVE-2025-0411 7-zip 漏洞复现

文章目录 免责申明漏洞描述影响版本漏洞poc漏洞复现修复建议 免责申明 本文章仅供学习与交流&#xff0c;请勿用于非法用途&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任 漏洞描述 此漏洞 &#xff08;CVSS SCORE 7.0&#xff09; 允许远程攻击者绕…

洛谷P1030 [NOIP2001 普及组] 求先序排列(c++)详解

题目链接&#xff1a;P1030 [NOIP2001 普及组] 求先序排列 - 洛谷 | 计算机科学教育新生态 思路&#xff1a; 1.先确定跟节点 2.根据根节点&#xff0c;划分出左右子树 中&#xff1a;BADC 后&#xff1a;BDCA 分析&#xff1a; 根据后序遍历&#xff0…

基于 PyTorch 的深度学习模型开发实战

&#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 引言 深度学习已广泛应用于图像识别、自然语言处理、自动驾驶等领域&#xff0c;凭借其强大的特征学习能力&#xff0c;成为人工…

VScode+ESP-IDF搭建ESP32开发环境

VScodeESP-IDF搭建ESP32开发环境 ESP-IDF安装方式&#xff1a; 离线安装 ESP-IDF下载;VSCode插件安装ESP-IDF; 这里选择VSCode 环境 ESP-IDF 插件方式安装&#xff0c; VSCode 插件市场中搜索并安装 ESP-IDF 插件&#xff1a; 安装完成后侧边栏会多出一个 ESP-IDF 标志&…

【数据分享】1929-2024年全球站点的逐月平均能见度(Shp\Excel\免费获取)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff01;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2024年全球气象站点…