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号