WPF命令绑定核心是ICommand接口,推荐用RelayCommand实现解耦与自动启停;需在属性变更后调用CommandManager.InvalidateRequerySuggested刷新状态,RoutedCommand适用于跨控件共享或快捷键场景。
WPF 中命令绑定的核心是 ICommand 接口,它让 UI 操作(比如按钮点击)和业务逻辑解耦,比直接写 Click 事件更灵活、可测试、支持自动启停(如按钮灰化)。下面用最常用也最实用的方式讲清楚怎么用。
WPF 自身没提供 ICommand 的默认实现,但社区广泛使用 RelayCommand(也叫 DelegateCommand)——它用 Action 和 Func 封装执行逻辑和判断逻辑,轻量又直观。
public class RelayCommand : ICommand
{
private readonly Action _execute;
private readonly Func_canExecute;
public RelayCommand(Action execute, FunccanExecute = null)
{
_execute = execute;
_canExecute = canExecute ?? (() => true);
}
public bool CanExecute(object parameter) => _canExecute();
public void Execute(object parameter) => _execute();
public event EventHandler CanExecuteChanged
{add => CommandManager.RequerySuggested += value;
remove => CommandManager.RequerySuggested -= value;
}
}
public class MainViewModel
{
public ICommand SaveCommand { get; }
public MainViewModel()
{
SaveCommand = new RelayCommand(OnSave, CanSave);
}
private void OnSave() => MessageBox.Show("已保存");
private bool CanSave() => !string.IsNullOrWhiteSpace(Title); // 假设有个 Title 属性
}
把按钮的 Command 属性直接绑定到 ViewModel 的 ICommand 属性,WPF 会自动调用 Execute,并根据 CanExecute 结果控制是否启用。
命令能否执行不是一成不变的,比如输入框为空时“保存”按钮应禁用。WPF 不会自动监听你的属性变化,得手动通知。
private string _title;
public string Title
{
get => _title;
set
{
_title = value;
OnPropertyChanged(); // INotifyPropertyChanged 实现
CommandManager.InvalidateRequerySuggested(); // 关键!告诉 WPF 重新查 CanExecute
}
}
如果你需要响应 Ctrl+S、或让多个控件共用一个命令(比如“复制”在菜单和工具栏都可用),用 WPF 自带的 RoutedCommand 更合适。
public static class ApplicationCommands
{
public static readonly RoutedCommand Save = new RoutedCommand();
}
Executed="OnSaveExecuted"
CanExecute="OnSaveCanExecute"/>
private void OnSaveExecuted(object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show("RoutedCommand 保存");
}
private void OnSaveCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = !string.IsNullOrEmpty(Title);
}
基本上就这些。RelayCommand + Binding 是日常开发主力,RoutedCommand 用在需要路由或跨控件共享的场景。不复杂但容易忽略 CommandManager.InvalidateRequerySuggested 这一步——少了它,按钮状态就不会自动更新。
# app
# 工具
# ai
# 路由
# win
# c#
# gate
# 封装
# 构造函数
# 接口
# 对象
# 事件
# wpf
# ui
# 绑定
# 如果你
# 放在
# 有个
# 就能
# 多个
# 你在
# 设为
# 适用于
# 少了
相关文章:
建站之星官网登录失败?如何快速解决?
如何在阿里云虚拟服务器快速搭建网站?
学校为何禁止电信移动建设网站?
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
成都网站制作报价公司,成都工业用气开户费用?
娃派WAP自助建站:免费模板+移动优化,快速打造专业网站
网站制作新手教程,新手建设一个网站需要注意些什么?
我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?
Android使用GridView实现日历的简单功能
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
如何使用Golang安装API文档生成工具_快速生成接口文档
c# await 一个已经完成的Task会发生什么
网站微信制作软件,如何制作微信链接?
php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】
设计网站制作公司有哪些,制作网页教程?
如何安全更换建站之星模板并保留数据?
代刷网站制作软件,别人代刷火车票靠谱吗?
如何确保西部建站助手FTP传输的安全性?
香港服务器租用每月最低只需15元?
枣阳网站制作,阳新火车站打的到仙岛湖多少钱?
外汇网站制作流程,如何在工商银行网站上做外汇买卖?
h5网站制作工具有哪些,h5页面制作工具有哪些?
模具网站制作流程,如何找模具客户?
b2c电商网站制作流程,b2c水平综合的电商平台?
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
宝塔面板创建网站无法访问?如何快速排查修复?
建站之星24小时客服电话如何获取?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
视频网站app制作软件,有什么好的视频聊天网站或者软件?
网站设计制作企业有哪些,抖音官网主页怎么设置?
青岛网站建设如何选择本地服务器?
定制建站是什么?如何实现个性化需求?
香港服务器WordPress建站指南:SEO优化与高效部署策略
如何在Windows 2008云服务器安全搭建网站?
如何用虚拟主机快速搭建网站?详细步骤解析
如何快速选择适合个人网站的云服务器配置?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
建站之星安装失败:服务器环境不兼容?
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
上海网站制作网站建设公司,建筑电工证网上查询系统入口?
建站之星如何开启自定义404页面避免用户流失?
制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?
小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
如何在西部数码注册域名并快速搭建网站?
潮流网站制作头像软件下载,适合母子的网名有哪些?
移民网站制作流程,怎么看加拿大移民官网?
成都响应式网站开发,dw怎么把手机适应页面变成网页?
*请认真填写需求信息,我们会在24小时内与您取得联系。