[RxUI] 17.1 – 样板代码
如果厌倦了为属性更改通知编写样板代码,可以尝试PropertyChanged.Fody或ReactiveUI.Fody。这些库都基于Fody(一个编造.NET程序集的扩展工具),它们将在编译时为属性注入INotifyPropertyChanged
代码。建议使用ReactiveUI.Fody包,因为该包还处理ObservableAsPropertyHelper
属性。
读写属性
通常,属性声明如下:
private string name;
public string Name
{
get => name;
set => this.RaiseAndSetIfChanged(ref name, value);
}
使用ReactiveUI.Fody,就不必为读写属性的getter和setter编写样板代码 — 该包将在编译时自动完成。需要做的就是用[Reactive]
属性注释该属性,如下所示:
[Reactive]
public string Name { get; set; }
注释 ReactiveUI.Fody 目前不支持内联自动属性初始化器。不要尝试编写类似
public string Name { get; set; } = "Name";
这样的代码,这将无法按照预期工作,并且可能会引发非常奇怪的异常。若要解决此问题,请将属性初始化代码移至视图模型类的构造函数。这是已知问题,并且正在对此进行跟踪。
ObservableAsPropertyHelper属性
同样的,要声明输出属性,代码如下:
ObservableAsPropertyHelper<string> firstName;
public string FirstName => firstName.Value;
然后,通过调用ToProperty
来初始化:
// firstNameObservable is IObservable<string>
firstName = firstNameObservable
.ToProperty(this, x => x.FirstName);
使用ReacticveUI.Fody,可以使用下面两个选项中的一个利用[ObservableAsProperty]
属性简单的声明一个只读属性。
一种是注释属性的getter:
public string FirstName { [ObservableAsProperty] get; }
另一种是注释整个属性:
[ObservableAsProperty]
public string FirstName { get; }
将在编译时生成字段并实现该属性。因为没有任何字段可以传递给ToProperty
,所以应该使用该库提供的ToPropertyEx
扩展方法:
// firstNameObservable is IObservable<string>
firstNameObservable.ToPropertyEx(this, x => x.FirstName);
该扩展名将分配自动生成的字段,而不是依赖out
参数。
注释 如果尚未通过调用
ToPropertyEx
初始化,则使用[ObservableAsProperty]
进行注释的类型为T
的属性将返回default(T)
。更具体地说,生成的getter代码看起来像T PropertyName => oaph?.Value ?? default(T);
,其中oaph
是ObservableAsPropertyHelper<T>
类型的字段,该字段由编译器生成。原文 https://www.reactiveui.net/docs/handbook/view-models/boilerplate-code