WPF 解决 CommandParameter 参数不更新问题
参考
环境
软件/系统 | 版本 | 说明 |
---|---|---|
Windows | Windows 10 专业版 22H2 19045.4046 | |
Microsoft Visual Studio | Microsoft Visual Studio Community 2022 (64 位) - 17.6.5 | |
Microsoft .Net SDK | 8.0.101 | 手动安装 |
Microsoft .Net SDK | 7.0.306 | Microsoft Visual Studio 携带 |
.net | 6.x | 创建当前文章演示 WPF 项目时指定 .net 版本所选择的框架 |
Prism Template Pack | 2.4.1 | Microsoft Visual Studio 扩展 |
XAML Style for Visual Studio 2022 | 3.2311.2 | Microsoft Visual Studio 扩展(XAML 自动格式化) |
HandyControl | 3.5.1 | NuGet包 |
Prism.DryIoc | 8.1.97 | NuGet包 |
提示
本文使用到了 Prism ,但是未使用该框架也可以用本方法解决。
正文
问题
在 ViewModel 中定义了 bool Listening
,在 XAML CommandParameter 中进行绑定,当 Listening
值更新时,CommandParameter 接收的 Listening
不更新。
解决
- 当使用 Prism 框架时,窗口的 MVVM 需要继承 BindableBase,并且参数更新时调用 SetProperty 方法(通知 UI 参数进行了更新)。
// 以 MainWindow 窗口与 Listening 参数举例
using FileMonitoring.Commands;
using FileMonitoring.Views;
using Prism.Mvvm;
using System.ComponentModel;
using System.Data.Common;
using System.Windows;
using System.Windows.Input;
using System.Xml.Linq;
namespace FileMonitoring.ViewModels
{
public class MainWindowViewModel : BindableBase
{
private bool _listening = false;
public bool Listening
{
get { return _listening; }
set {
SetProperty(ref _listening, value);
}
}
}
}
- 命令接口继承
ICommand
时实现了public event EventHandler CanExecuteChanged;
,需要调整为如下代码才可以重新触发 CanExecute 事件 :
public event EventHandler CanExecuteChanged {
add{CommandManager.RequerySuggested += value;}
remove{CommandManager.RequerySuggested -= value;}
}
完整命令接口 ICommand
实现为:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using static ImTools.ImMap;
namespace FileMonitoring.Commands
{
/**
* 开启监听命令
*/
internal class OnStartListenCommand : ICommand
{
private Action<object?> _execute;
public OnStartListenCommand(Action<object?> execute)
{
_execute = execute;
}
public event EventHandler CanExecuteChanged {
add{CommandManager.RequerySuggested += value;}
remove{CommandManager.RequerySuggested -= value;}
}
public bool CanExecute(object parameter)
{
return !(parameter as bool?) ?? false;
}
public void Execute(object parameter)
{
Trace.WriteLine("开启监听命令");
_execute(parameter);
}
}
}
博 主 :夏秋初
地 址 :https://www.cnblogs.com/xiaqiuchu/p/18063220
如果对你有帮助,可以点一下 推荐 或者 关注 吗?会让我的分享变得更有动力~
转载时请带上原文链接,谢谢。
地 址 :https://www.cnblogs.com/xiaqiuchu/p/18063220
如果对你有帮助,可以点一下 推荐 或者 关注 吗?会让我的分享变得更有动力~
转载时请带上原文链接,谢谢。
标签:
WPF
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义