C# WPF CommunityToolkit.MVVM (测试一)

MainWindow.xaml

<Window x:Class="CommunityToolkit.MVVM_RelayCommand_测试.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:CommunityToolkit.MVVM_RelayCommand_测试"mc:Ignorable="d"Title="MainWindow" Height="150" Width="200"><StackPanel><Button Width="150" Height="30" Margin="0 30 0 0" Command="{Binding IncrementCounterCommand}" >click</Button><TextBlock Width="150" Height="30" Text="{Binding Counter}"></TextBlock></StackPanel>
</Window>

MainWindow.cs

using System.Diagnostics.Metrics;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace CommunityToolkit.MVVM_RelayCommand_测试
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext
= new MainWindowViewModel();
}
}
}

MainWindowViewModel.cs

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Diagnostics.Metrics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace CommunityToolkit.MVVM_RelayCommand_测试
{
internal partial class MainWindowViewModel:ObservableObject
{
[ObservableProperty]
private int _counter;
public RelayCommand IncrementCounterCommand { get; }

    </span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">void</span><span style="color: #000000;"> IncrementCounter(){Counter</span>++<span style="color: #000000;">;IncrementCounterCommand.NotifyCanExecuteChanged();  //注意这里是关键} </span><span style="color: #0000ff;">public</span><span style="color: #000000;"> MainWindowViewModel(){IncrementCounterCommand </span>= <span style="color: #0000ff;">new</span><span style="color: #000000;"> RelayCommand(IncrementCounter, CanExecute);}</span><span style="color: #0000ff;">private</span> <span style="color: #0000ff;">bool</span><span style="color: #000000;"> CanExecute(){           </span><span style="color: #0000ff;">return</span> Counter &lt;= <span style="color: #800080;">3</span><span style="color: #000000;">;}
}

}

 

1、初步使用 CommunityToolkit.MVVM 中的RelayCommand

2、通过属性的变更来改变按钮的状态。

 

 

以下是deepseek的纠错信息:

 

 

 

你的代码中,按钮的 IsEnabled 绑定到了 IncrementCounterCommand.CanExecute,但这里存在几个问题:

问题分析:

  1. RelayCommand.CanExecute 不是一个可绑定的属性
    RelayCommandCanExecute 是一个方法(通过 ICommand.CanExecute 实现),而不是一个可绑定的属性(如 INotifyPropertyChanged 属性)。因此,当 CanExecute() 的返回值改变时,UI 无法自动收到通知。

  2. 没有通知机制更新按钮状态
    Counter 改变时,你需要手动调用 IncrementCounterCommand.NotifyCanExecuteChanged(),这样按钮才会重新查询 CanExecute() 方法并更新状态(启用/禁用)。但你的代码中并没有在 Counter 改变时触发通知。

解决方案:

方案1:使用 [RelayCommand] 特性(推荐)

CommunityToolkit.Mvvm 提供了 [RelayCommand] 特性,可以自动生成命令,并支持自动通知 CanExecute 变化。你只需要在方法上添加 [RelayCommand] 并指定 CanExecute 方法名即可。

修改 MainWindowViewModel.cs

using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System.Windows.Input;namespace CommunityToolkit.MVVM_RelayCommand_测试
{
internal partial class MainWindowViewModel : ObservableObject
{
[ObservableProperty]
private int _counter;// 使用 [RelayCommand] 特性自动生成命令,并指定 CanExecute 方法
[RelayCommand(CanExecute = nameof(CanExecute))]
private void IncrementCounter() => Counter++;private bool CanExecute() => Counter <= 3;// 当 Counter 改变时,通知命令的 CanExecute 可能已改变
partial void OnCounterChanged(int value)
{
// 通知命令重新检查 CanExecute
IncrementCounterCommand.NotifyCanExecuteChanged();
}
}
}

方案2:手动调用 NotifyCanExecuteChanged

如果你不想使用特性,可以在 Counter 的 setter 中手动通知命令状态变化(但你已经使用了 [ObservableProperty],所以可以通过部分方法 OnCounterChanged 来实现)。

修改 XAML 绑定:

你不需要绑定 IsEnabled,因为 ICommand 本身就会控制按钮的启用状态。只需移除 IsEnabled 绑定:

<Button Width="150" Height="30" Margin="0 30 0 0"
Command="{Binding IncrementCounterCommand}">click</Button>

总结:

  • 使用 [RelayCommand] 特性简化命令定义。
  • Counter 变化时调用 NotifyCanExecuteChanged()
  • 不需要手动绑定 IsEnabled,因为 ICommand 会自动管理按钮状态。

修改后,当 Counter 超过 3 时,按钮会自动禁用(变为灰色)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/908894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux kernel synchronization rcu

Read Copy Update /RCU 可以单个写,多个读,在内核中常用于更新链表。对比顺序锁,只能用指针访问资源,读数据无需加锁,避免多次读数据。 应用场景:多个读 少量写 写相较于读具有更高优先级 rcu保持数据指针的引用…

完整教程:机器学习入门,用Lima在macOS免费搭建Docker环境,彻底解决镜像与收费难题!

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

go语言中的基本数据类型

go语言中的基本数据类型package mainimport ("fmt" )func main() {// 整型var a int = 10var b int8 = -8var c uint16 = 65535var d int64 = 1234567890// 浮点型var e float32 = 3.14var f float64 = 2.71…

实用指南:rsync +生产级 lsyncd 实时同步方案

实用指南:rsync +生产级 lsyncd 实时同步方案2025-09-21 16:51 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: …

锁定Nvidia驱动版本

在 Ubuntu 系统中,NVIDIA 显卡驱动通常通过系统的包管理器(如 apt)进行管理和更新。要防止 NVIDIA 驱动程序自动更新,你可以锁定当前安装的驱动版本,这样即使系统进行了更新,驱动程序也会保持在当前版本。以下是…

第二十一章-sql 注入-union 联合注入 (1)

用户须知1.免责声明:本教程作者及相关参与人员对于任何直接或间接使用本教程内容而导致的任何形式的损失或损害,包括但不限于数据丢失、系统损坏、个人隐私泄露或经济损失等,不承担任何责任。所有使用本教程内容的个…

Android开发参考

WorkManager https://www.cnblogs.com/octsun/category/2471458.html

求出e的值

//题意:利用公式e = 1 + 1/1! + 1/2! + 1/3! + ... + 1/n! 求e ; //输入:只有一行,该行包含一个整数n(2<=n<=15),表示计算e时累加到1/n!。 //输出:输出只有一行,该行包含计算出来的e的值,要求打印小数…

CSP-S模拟24

前言: 没写完的话就先咕着,先滚去学文化课了。 \(T1:\) 炒币 \(T2:\) 凑数 \(T3:\) 同构 \(T4:\) 重建

今年CSP...

我要晋级,我要晋级,我要晋级,我要晋级考的依托。J组,阅读程序第二道,第二层for循环的";"号没看到。大概86.5~88.5左右,还是江苏,晋级有点悬啊。能考88.5还是有点意外,以前都没真正意义上做过一张试卷…

实用指南:VGG改进(9):融合Axial Attention的VGG16架构

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

0voice-2.1.1-io多路复用select/poll/epoll

select之前的模式:\(1\) 请求 , \(1\) 线程好处:代码逻辑简单 缺点:不利于并发, \(1 \ k\) 并发量左右select 提供文件集合 fd_set,集合的大小

Transformer与ViT

前言: Transformer 结构非常重要,需要认真学习一遍 李沐老师课程 Transformer 论文 Transformer 代码 Transformer 自测题目 [Transformer 博客](Transformer/BERT/实战 | 冬于的博客 (ifwind.github.io)) 一.Trans…

comfUI背后的技术——VAE - 实践

comfUI背后的技术——VAE - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&qu…

实用指南:Maven、Spring Boot、Spring Cloud以及它们的相互关系

实用指南:Maven、Spring Boot、Spring Cloud以及它们的相互关系2025-09-21 16:28 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !imp…

【57页PPT】智慧高效的方案智慧医院信息化整体规划设计方案(附下载方式)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

WordPress开放嵌入自动发现功能中的XSS漏洞分析

本文详细分析了WordPress中通过开放嵌入自动发现功能存在的XSS漏洞,包括postMessage()机制的安全问题、Safari浏览器的特殊行为以及完整的漏洞复现步骤,揭示了广泛使用的平台仍可能存在安全风险。WordPress开放嵌入自…

第二次软工作业

第二次软工作业软件工程第二次作业_个人项目 Github连接: mocheen/se_homework: homework ](https://github.com/mocheen/se_homework) 这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class12Grade23Comp…

20250921 模拟赛 T4 题解

Description https://zhengruioi.com/problem/3343?cid=1976 Solution 容易发现区间 LIS 满足四边形不等式,所以最终的答案关于划分段数是凸的。 设 \(d_i=f_i-f_{i-1}\)。那么由于 \(\sum d_i=n\) 且 \(d_i\) 不增,…