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);
}
因此,您可能可以从中推断出您是如何得出所看到的事件顺序的。每一个都按顺序发生,并且每一个都由您的订阅者写入控制台:
- 您更改
CommonProperty
,它调用 raisePropertyChanged("CommonProperty")
,然后使用 sender.RaisePropertyChanged
引发事件。
- 此事件导致
DependentProperty
被重新计算,从而导致调用 raisePropertyChanged("DependentProperty")
,从而引发上述事件。
notifyObservable
然后为 DependentProperty
调用。这会推动 changed
通过 Changed
可观察对象。
- 然后控制returns到
raisePropertyChanged
为CommonProperty
和notifyObservable
为CommonProperty
调用。
我有一个反应对象:
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);
}
因此,您可能可以从中推断出您是如何得出所看到的事件顺序的。每一个都按顺序发生,并且每一个都由您的订阅者写入控制台:
- 您更改
CommonProperty
,它调用raisePropertyChanged("CommonProperty")
,然后使用sender.RaisePropertyChanged
引发事件。 - 此事件导致
DependentProperty
被重新计算,从而导致调用raisePropertyChanged("DependentProperty")
,从而引发上述事件。 notifyObservable
然后为DependentProperty
调用。这会推动changed
通过Changed
可观察对象。- 然后控制returns到
raisePropertyChanged
为CommonProperty
和notifyObservable
为CommonProperty
调用。