CommunityToolkit.Mvvm源生成器

发布时间:2024年01月24日

引言

MVVM 工具包包含全新的 Roslyn 源生成器,有助于在使用 MVVM 体系结构编写代码时大幅减少样板。这意味着,在编写代码时,MVVM 工具包生成器现在将负责在后台为你生成其他代码。

以前:

private string? name;

public string? Name
{
    get => name;
    set => SetProperty(ref name, value);
}

private void SayHello()
{
    Console.WriteLine("Hello");
}

private ICommand? sayHelloCommand;

public ICommand SayHelloCommand => sayHelloCommand ??= new RelayCommand(SayHello);

现在:

[ObservableProperty]
private string? name;

[RelayCommand]
private void SayHello()
{
    Console.WriteLine("Hello");
}

利用特性可以自动后台生成冗余代码,根据字段自动公开一个首字母大写的属性,可供View绑定使用。

需要继承 ObservableObject

ObservableProperty特性

除了帮我们自动生成更改通知代码,还可以:

1、便捷的更改时或更改后运行代码编写

[ObservableProperty]
private string? name;

对于上述代码,工具包会为我们自动生成以下代码:

public string? Name
{
    get => name;
    set
    {
        if (!EqualityComparer<string?>.Default.Equals(name, value))
        {
            string? oldValue = name;
            OnNameChanging(value);
            OnNameChanging(oldValue, value);
            OnPropertyChanging();
            name = value;
            OnNameChanged(value);
            OnNameChanged(oldValue, value);
            OnPropertyChanged();
        }
    }
}

partial void OnNameChanging(string? value);
partial void OnNameChanged(string? value);

partial void OnNameChanging(string? oldValue, string? newValue);
partial void OnNameChanged(string? oldValue, string? newValue);

其中为我们准备了四个分布方法,分别在值改变中 或 改变后被调用。如有需要我们可以通过重写该方法达到想要的目的,如下:

[ObservableProperty]
private string? name;

partial void OnNameChanging(string? value)
{
    Console.WriteLine($"Name is about to change to {value}");
}

partial void OnNameChanged(string? value)
{
    Console.WriteLine($"Name has changed to {value}");
}

2、通知依赖属性

FullName属性与之相关联、依赖

[ObservableProperty]
[NotifyPropertyChangedFor(nameof(FullName))]
private string? name;

public string FullName{get=>"123"+Name}

3、通知依赖命令

MyMethodCommand命令,其执行状态依赖于此属性的值。 也就是说,每当此属性发生更改时,命令的执行状态都应失效并再次计算

[ObservableProperty]
[NotifyCanExecuteChangedFor(nameof(MyMethodCommand))]
private string? name;

[RelayCommand(CanExecute = nameof(CanExecute))]
private void MyMethod()
{
    Console.WriteLine("Hello!");
}

bool CanExecute => Name.Length > 10

4、属性验证

如果在继承自 ObservableValidator 的类型中声明属性,则可以使用任何验证特性对该属性进行标记,然后请求生成的资源库触发对该属性的验证。 可以使用 NotifyDataErrorInfo 特性实现此目的:

[ObservableProperty]
[NotifyDataErrorInfo]
[Required]
[MinLength(2)] // Any other validation attributes too...
private string? name;

文章来源:https://blog.csdn.net/weixin_42253874/article/details/135816423
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。