[RxUI] 17.1 – 样板代码

[RxUI] 17.1 – 样板代码

如果厌倦了为属性更改通知编写样板代码,可以尝试PropertyChanged.FodyReactiveUI.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);,其中oaphObservableAsPropertyHelper<T>类型的字段,该字段由编译器生成。

原文 https://www.reactiveui.net/docs/handbook/view-models/boilerplate-code

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注