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

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>


http://www.kler.cn/a/524273.html

相关文章:

  • [C语言日寄] <stdio.h> 头文件功能介绍
  • Spring AI 在微服务中的应用:支持分布式 AI 推理
  • Android车机DIY开发之学习篇(七)NDK交叉工具构建
  • 未来无线技术的发展方向
  • 微服务(一)
  • 移动光猫怎么自己改桥接模式?
  • WordPress Icegram Express插件Sql注入漏洞复现(CVE-2024-2876)(附脚本)
  • Java 大视界 -- Java 大数据在自动驾驶中的数据处理与决策支持(68)
  • 安卓逆向之脱壳-认识一下动态加载 双亲委派(一)
  • 设计模式的艺术-观察者模式
  • (done) ABI 相关知识补充:内核线程切换、用户线程切换、用户内核切换需要保存哪些寄存器?
  • MATLAB中extractAfter函数用法
  • Git进阶之旅:Git 命令
  • Django ORM解决Oracle表多主键的问题
  • 全程Kali linux---CTFshow misc入门(1-12)
  • CMake常用命令指南(CMakeList.txt)
  • Vue 3 30天精进之旅:Day 07 - Vue Router
  • 【Python百日进阶-Web开发-FastAPI】Day812 - FastAPI Cookie 参数、Header 参数
  • 运用python爬虫爬取汽车网站图片并下载,几个汽车网站的示例参考
  • 一个python项目中的文件和目录的作用是什么?scripts,venv,predict的具体含义
  • GO 高级特性篇
  • 常见端口的攻击思路
  • 爱书爱考平台说明
  • C#操作GIF图片(上)
  • python+playwright自动化测试(八):iframe切换、多窗口切换
  • Go Fx 框架使用指南:深入理解 Provide 和 Invoke 的区别