ReactiveUI 更改可观察通知具有奇怪的顺序

ReactiveUI Change observable notifications has strange order

我有一个反应对象:

public class Example : ReactiveObject
{
    private string _commonProperty;
    public string CommonProperty
    {
        get { return _commonProperty; }
        set { this.RaiseAndSetIfChanged(ref _commonProperty, value); }
    }

    private readonly ObservableAsPropertyHelper<string> _dependent;
    public string DependentProperty => _dependent.Value;

    public Example()
    {
        _dependent = this.WhenAnyValue(e => e.CommonProperty)
            .Select(s => s?.ToUpper())
            .ToProperty(this, e => e.DependentProperty);
    }
}

并且当我更改 CommonProperty 的值时,PropertyChanged 事件的顺序和已更改的可观察项不相同。

例如:

var example = new Example();
example.PropertyChanged += (sender, args) => Console.WriteLine("Event: " + args.PropertyName);
example.Changed.Subscribe(args => Console.WriteLine("Changed Observable: " + args.PropertyName));
example.CommonProperty = "newValue";

打印

Event: CommonProperty
Event: DependentProperty
Changed Observable: DependentProperty
Changed Observable: CommonProperty

Events 有预期的顺序,但 Changed observable 不是。 所以问题是为什么 Changed Observable: DependentProperty 出现在 Changed Observable: CommonProperty?

之前

此外,我期望这样的输出:

Event: CommonProperty
Changed Observable: CommonProperty
Event: DependentProperty
Changed Observable: DependentProperty

为什么关于相同 属性 的事件和可观察通知是分开的?

我不确定这是否重要,我当然不会依赖它。这只是一个实现细节。

通过快速查看 RxUI 6 的源代码,属性 changed 事件的引发最终在 this method call:

结束
public void raisePropertyChanged(string propertyName)
{
    if (!this.areChangeNotificationsEnabled())
        return;

    var changed = new ReactivePropertyChangedEventArgs<TSender>(sender, propertyName);
    sender.RaisePropertyChanged(changed);

    this.notifyObservable(sender, changed, this.changedSubject);
}

因此,您可能可以从中推断出您是如何得出所看到的事件顺序的。每一个都按顺序发生,并且每一个都由您的订阅者写入控制台:

  1. 您更改 CommonProperty,它调用 raisePropertyChanged("CommonProperty"),然后使用 sender.RaisePropertyChanged 引发事件。
  2. 此事件导致 DependentProperty 被重新计算,从而导致调用 raisePropertyChanged("DependentProperty"),从而引发上述事件。
  3. notifyObservable 然后为 DependentProperty 调用。这会推动 changed 通过 Changed 可观察对象。
  4. 然后控制returns到raisePropertyChangedCommonPropertynotifyObservableCommonProperty调用。