.NET Community Toolkit 8.2 版正式发布!新版本包括在运行时和 MVVM Toolkit 源码生成器中的性能改进、新代码修复程序、新的用户请求功能等内容。
.NET 社区工具包是一组适用于所有 .NET 开发人员,且与不绑定 UI 平台的帮助程序和 API。该工具包由 Microsoft 维护和发布,是 .NET 基金会的一部分,它被多个微软内部项目和应用程序使用,例如 Microsoft Store。
.NET 社区工具包的所有库最初都是 Windows 社区工具包的一部分,但随着时间的推移,仅针对 .NET 且不特定于 Windows 的 API 数量不断增加,微软决定将 .NET 相关的内容拆分到一个单独的项目中,以便它们可以独立发展,.NET Community Toolkit 由此诞生。
[RelayCommand]
的自定义属性
新的 8.2.0 版本的 MVVM 工具包在使用 [RelayCommand]
时包括对自定义属性的支持,利用原生的 field:
和 property:
C# 语法来指示自定义属性的目标。这样一来,在使用 [RelayCommand]
生成 MVVM 命令时,可以完全控制所有生成成员的属性。
比如
[RelayCommand]
[property: JsonIgnore]
private void DoWork()
{
// Do some work here...
}
会生成如下成员,且生成的 DoWorkCommand
属性具有指定的属性
private RelayCommand? _doWorkCommand;
[JsonIgnore]
public IRelayCommand DoWorkCommand => _doWorkCommand ??= new RelayCommand(DoWork);
新的 [ObservableProperty]
更改 hook
MVVM 中一个相对常见的场景是有一些“选择的项目”可观察属性,例如当前选择的用户,或嵌套的视图模型。当此属性的值发生变化时,还必须对新旧实例进行一些调整。例如,设置一些“selected”属性,或者订阅事件。
以前,在这种情况下使用 [ObservableProperty]
并不理想,因为它没有必要的基础设施,来轻松注入此类逻辑以对设置的旧值和新值执行必要的状态更改。
为了解决这个问题,从 MVVM 工具包的 8.2 版本开始,为所有 [ObservableProperty]
字段生成了两个新的属性更改 hook。示例:
[ObservableProperty]
private DocumentViewModel _selectedDocument;
现在将生成如下代码:
public DocumentViewModel SelectedDocument
{
get => _selectedDocument;
set
{
if (!EqualityComparer<DocumentViewModel>.Default.Equals(_selectedDocument, value))
{
DocumentViewModel? oldValue = _selectedDocument;
OnNameChanging(value);
OnNameChanging(oldValue, value);
OnPropertyChanging();
_selectedDocument = value;
OnNameChanged(value);
OnNameChanged(oldValue, value);
OnPropertyChanged();
}
}
}
partial void OnSelectedDocumentChanging(DocumentViewModel value);
partial void OnSelectedDocumentChanged(DocumentViewModel value);
partial void OnSelectedDocumentChanging(DocumentViewModel? oldValue, DocumentViewModel newValue);
partial void OnSelectedDocumentChanged(DocumentViewModel? oldValue, DocumentViewModel newValue);
注意正在生成的两个新的“OnPropertyNameChanging”和“Changed”方法,这两个提供了易于使用的 hook,用于注入在每个属性更改事件上触发的代码,且可以修改正在设置的旧值和新值。
MVVM 工具包代码修复器
之前版本的 MVVM Toolkit 添加了两个新的诊断分析器,它们会在错误访问标有 [ObservableProperty]
的字段,以及在使用声明具有 [ObservableProperty]
和类似属性的类型时产生警告。
在 8.2 版本中,这两个分析器还包括内置的代码修复器。只需将鼠标悬停在 IntelliSense 灯泡上,选择代码修复,该功能会自动应用所有更改,以使代码恢复到正确的状态。支持批量修复:
MVVM 工具包源代码生成器优化
MVVM Toolkit 8.2 还对其源代码生成器进行了一些性能改进。这一次重点是优化增量管道,以最大限度地减少内存使用,并确保不会在并发执行中保持不必要的对象。
以下是一些用于改进这一点的 PR:
- 将剩余的诊断移至分析器 ( #581 ):MVVM 工具包中的另外两个诊断已移至诊断分析器,该分析器可以同时运行并在进程外运行。
- 在分析器中尽早解析符号 ( #587 ):所有必要的分析器符号现在都在初始回调设置期间解析,加快了每个编译实例中的回调执行。
其他改动和改进可在发布公告中查阅。