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]
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}");
}
FullName属性与之相关联、依赖
[ObservableProperty]
[NotifyPropertyChangedFor(nameof(FullName))]
private string? name;
public string FullName{get=>"123"+Name}
MyMethodCommand命令,其执行状态依赖于此属性的值。 也就是说,每当此属性发生更改时,命令的执行状态都应失效并再次计算
[ObservableProperty]
[NotifyCanExecuteChangedFor(nameof(MyMethodCommand))]
private string? name;
[RelayCommand(CanExecute = nameof(CanExecute))]
private void MyMethod()
{
Console.WriteLine("Hello!");
}
bool CanExecute => Name.Length > 10
如果在继承自 ObservableValidator 的类型中声明属性,则可以使用任何验证特性对该属性进行标记,然后请求生成的资源库触发对该属性的验证。 可以使用 NotifyDataErrorInfo
特性实现此目的:
[ObservableProperty]
[NotifyDataErrorInfo]
[Required]
[MinLength(2)] // Any other validation attributes too...
private string? name;