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 不更新。

解决

  1. 当使用 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);
            }
        }
    }
}
  1. 命令接口继承 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);
			}
		}
	}

posted @   夏秋初  阅读(153)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示