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
如果对你有帮助,可以点一下 推荐 或者 关注 吗?会让我的分享变得更有动力~
转载时请带上原文链接,谢谢。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号