2016-06-22 48 views
1

我有一個ReactiveObject:ReactiveUI變化觀察的通知,有奇怪的順序

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 

活動已期待的順序,但改變觀察的不是。 所以問題是爲什麼Changed Observable:DependentProperty之前Changed Observable:CommonProperty

而且,我希望這樣的輸出:

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

爲什麼大約相同的屬性事件和觀察的通知是分開的?

回答

2

我不知道這是重要的,我當然不會依賴它。這只是一個實現細節。

從快速瀏覽一下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. notifyObservable然後被要求爲DependentProperty。這通過Changed可觀察到推動changed
  4. 然後控制返回到raisePropertyChangedCommonPropertynotifyObservable被稱爲CommonProperty
+0

謝謝!我絕對同意我不應該依賴它。我只是預料到事件和觀察者的通知順序將是相同的,如果不是這樣,我認爲我做錯了什麼。 – Inok