【杂谈】“CommunityToolkit.Mvvm无法自动生成Get/Set属性对”的解决方案

最近在实践MVVM,发现这玩意儿挺有意思的,有点WPF的最佳搭档的感觉。UI自动跟随VM变化,极大程度上简化各类逻辑。UI元素的各种属性也会实时反馈到VM上,直接在VM处理事务逻辑即可。

但是MVVM在WPF上应用,最烦的就是要自己写一大堆Get/Set,以及匹配INotifyPropertyChanged的调用。虽然Visual Studio里有对应的code snippet:propfull来完成快速完成这个事情,但是仍然要手动补全OnPropertyChanged()的调用,而且也要打很多字,十分不方便。

在这里插入图片描述
然后嘛,这种事情肯定早就有人造了轮子解决了。网上一搜,CommunityToolkit.Mvvm映入眼帘。MIT协议,微软官方背书,而且实现也很完美。Field上加个Attribute就完事儿了,后台自动生成对应的get/set+OnPropetyChanged的调用代码。
在这里插入图片描述

详见:
https://learn.microsoft.com/en-us/dotnet/communitytoolkit/mvvm/generators/observableproperty

按照上面说的,直接进行一个Nuget Package的安装,使用8.0以上版本即可享受到这个自动的待遇。

但是…… 装完好像有问题啊,这代码也没有自动生成啊(.Net Framework, Console项目),后面观察到网上的例子大部分都是高级版本的.NET或者是WPF应用程序项目,怎么,Console不能Mvvm了?
在这里插入图片描述
经过一番调查研究嘛,这个玩意儿的原理是Analyzer,它会类似于代码检查,当发现代码中包含这种带特别Attribute的满足某些条件(这里的条件是 1- 继承自ObservableObject,2- 标记为partial,3- Field被标记有ObservableProperty属性,当然有其他条件,可以查看这个Attribute的说明),则会自动生成 getter 和 setter。
所以嘛,找到项目,添加Analyzer。具体Analyzer的位置就在你的项目的sln文件的同级目录下的packages文件夹的CommunityToolkit.Mvvm...文件夹,具体位置如下

在这里插入图片描述
在这里插入图片描述
然后,似乎还是不太行嘛,但是这次Visual Studio给了个提示

在这里插入图片描述
原来是需要C# 8.0。那么好的,语言版本一改,重新加载项目,无敌起飞。

在这里插入图片描述
很好奇它自动生成的代码是什么的朋友们,可以直接F12点进去看看,这里就不展示了。

这样就完美解决了Mvvm在某些项目中,无法自动生成 getter/setter 的问题。

### 使用 CommunityToolkit.Mvvm 实现 DataContext=this 的绑定 在 WPF 应用程序中,`CommunityToolkit.Mvvm` 提供了一种简洁的方式来实现 MVVM 模式的开发。为了在窗体的后台代码中通过继承 `ObservableObject` 或其他相关类来实现 `DataContext=this` 的绑定,可以按照以下方式操作。 #### 1. 安装 CommunityToolkit.Mvvm NuGet 包 首先,在项目中安装 `CommunityToolkit.Mvvm` NuGet 包。这可以通过 Visual Studio 的 NuGet 包管理器或者命令行完成: ```bash Install-Package CommunityToolkit.Mvvm ``` #### 2. 创建 ViewModel 类并继承 ObservableObject `CommunityToolkit.Mvvm` 中提供了 `ObservableObject` 基类,它实现了 `INotifyPropertyChanged` 接口,用于支持属性更改的通知机制。以下是创建 ViewModel 的示例: ```csharp using CommunityToolkit.Mvvm.ComponentModel; namespace TestMvvm.ViewModels { public partial class MainViewModel : ObservableObject { [ObservableProperty] private string _name = "默认姓名"; public void UpdateName(string newName) { Name = newName; } } } ``` 在此示例中,`MainViewModel` 继承自 `ObservableObject`,并通过 `[ObservableProperty]` 特性简化了属性定义过程[^1]。 #### 3. 在 View 的后台代码中设置 DataContext 在窗体的后台代码中,可以直接实例化 ViewModel 并将其赋值给 `DataContext` 属性。以下是具体实现: ```csharp using System.Windows; using TestMvvm.ViewModels; namespace TestMvvm.Views { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); // 设置 DataContext 为当前窗口实例化的 ViewModel this.DataContext = new MainViewModel(); } } } ``` 此方法遵循传统的 `DataContext` 绑定模式,但在 ViewModel 部分利用了 `CommunityToolkit.Mvvm` 的特性[^1]。 #### 4. 自动绑定 ViewModel(可选) 如果希望进一步减少手动绑定的工作量,可以考虑使用工具库(如 Prism、Stylet 等)提供的自动绑定功能。例如,`Prism` 和 `Stylet` 支持基于命名约定的自动绑定[^2][^3]。不过需要注意的是,这些工具通常需要额外配置或依赖注入的支持。 --- ### 示例总结 通过上述步骤,可以在窗体的后台代码中轻松实现 `DataContext=this` 的绑定,并充分利用 `CommunityToolkit.Mvvm` 提供的功能。这种方式不仅保持了代码的简洁性,还增强了应用程序的可维护性和扩展性。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值