【问题标题】:ReactiveUI Change observable notifications has strange orderReactiveUI Change 可观察通知有奇怪的顺序
【发布时间】:2016-06-22 00:24:35
【问题描述】:

我有一个 ReactiveObject:

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 事件的顺序和 Changed 可观察项的顺序不同。

例如:

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

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

【问题讨论】:

    标签: c# observable reactiveui


    【解决方案1】:

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

    快速浏览一下 RxUI 6 的源代码,引发属性更改事件最终会在 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. 然后为DependentProperty 调用notifyObservable。这会将 changed 推送到 Changed 可观察对象。
    4. 然后控制权返回到raisePropertyChanged 以获取CommonProperty 并调用notifyObservable 以获取CommonProperty

    【讨论】:

    • 谢谢!我绝对同意我不应该依赖它。我只是希望事件的顺序和 observable 的通知是相同的,如果不是,我认为我做错了什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    相关资源
    最近更新 更多