11using System ;
22using System . Collections . Generic ;
33using System . Linq ;
4+ using System . Reactive . Disposables ;
45using System . Reactive . Linq ;
56using System . Text ;
67using System . Threading . Tasks ;
@@ -13,54 +14,65 @@ namespace ReactiveUI.Blend
1314 [ ContentProperty ( Name = "Actions" ) ]
1415 public sealed class ObservableTriggerBehavior : Behavior < DependencyObject >
1516 {
16- private object resolvedSource ;
17+ object resolvedSource ;
18+ SerialDisposable watcher ;
19+
20+ public ObservableTriggerBehavior ( )
21+ {
22+ watcher = new SerialDisposable ( ) ;
23+ watcher . Disposable = Disposable . Empty ;
24+ }
1725
1826 public ActionCollection Actions
1927 {
2028 get {
21- ActionCollection actionCollection = ( ActionCollection ) this . GetValue ( ObservableTriggerBehavior . ActionsProperty ) ;
29+ var actionCollection = ( ActionCollection ) this . GetValue ( ObservableTriggerBehavior . ActionsProperty ) ;
30+
2231 if ( actionCollection == null ) {
2332 actionCollection = new ActionCollection ( ) ;
2433 this . SetValue ( ObservableTriggerBehavior . ActionsProperty , actionCollection ) ;
2534 }
35+
2636 return actionCollection ;
2737 }
2838 }
39+
2940 public static readonly DependencyProperty ActionsProperty =
3041 DependencyProperty . Register ( "Actions" , typeof ( ActionCollection ) , typeof ( ObservableTriggerBehavior ) , new PropertyMetadata ( null ) ) ;
3142
32- public object SourceObject
33- {
43+ public object SourceObject {
3444 get { return this . GetValue ( ObservableTriggerBehavior . SourceObjectProperty ) ; }
3545 set { this . SetValue ( ObservableTriggerBehavior . SourceObjectProperty , value ) ; }
3646 }
3747 public static readonly DependencyProperty SourceObjectProperty =
3848 DependencyProperty . Register ( "SourceObject" , typeof ( object ) , typeof ( ObservableTriggerBehavior ) , new PropertyMetadata ( null , OnSourceObjectChanged ) ) ;
3949
40- private static void OnSourceObjectChanged ( DependencyObject dependencyObject , DependencyPropertyChangedEventArgs args )
41- {
42- ObservableTriggerBehavior observableTriggerBehavior = ( ObservableTriggerBehavior ) dependencyObject ;
43- observableTriggerBehavior . SetResolvedSource ( observableTriggerBehavior . ComputeResolvedSource ( ) ) ;
44- }
50+ public bool AutoResubscribeOnError { get ; set ; }
4551
46- public IObservable < object > Observable
47- {
52+ public IObservable < object > Observable {
4853 get { return ( IObservable < object > ) GetValue ( ObservableProperty ) ; }
4954 set { SetValue ( ObservableProperty , value ) ; }
5055 }
5156 public static readonly DependencyProperty ObservableProperty =
5257 DependencyProperty . Register ( "Observable" , typeof ( IObservable < object > ) , typeof ( ObservableTriggerBehavior ) , new PropertyMetadata ( null , onObservableChanged ) ) ;
5358
54- private void SetResolvedSource ( object newSource )
59+ static void OnSourceObjectChanged ( DependencyObject dependencyObject , DependencyPropertyChangedEventArgs args )
60+ {
61+ var observableTriggerBehavior = ( ObservableTriggerBehavior ) dependencyObject ;
62+
63+ observableTriggerBehavior . setResolvedSource ( observableTriggerBehavior . computeResolvedSource ( ) ) ;
64+ }
65+
66+ void setResolvedSource ( object newSource )
5567 {
56- if ( this . AssociatedObject == null || this . resolvedSource == newSource )
57- {
68+ if ( this . AssociatedObject == null || this . resolvedSource == newSource ) {
5869 return ;
5970 }
71+
6072 this . resolvedSource = newSource ;
6173 }
6274
63- private object ComputeResolvedSource ( )
75+ object computeResolvedSource ( )
6476 {
6577 if ( this . ReadLocalValue ( ObservableTriggerBehavior . SourceObjectProperty ) != DependencyProperty . UnsetValue ) {
6678 return this . SourceObject ;
@@ -69,19 +81,11 @@ private object ComputeResolvedSource()
6981 }
7082 }
7183
72- public bool AutoResubscribeOnError { get ; set ; }
73-
74- IDisposable watcher ;
75- protected static void onObservableChanged ( DependencyObject sender , DependencyPropertyChangedEventArgs e )
84+ static void onObservableChanged ( DependencyObject sender , DependencyPropertyChangedEventArgs e )
7685 {
7786 ObservableTriggerBehavior This = ( ObservableTriggerBehavior ) sender ;
78- if ( This . watcher != null )
79- {
80- This . watcher . Dispose ( ) ;
81- This . watcher = null ;
82- }
8387
84- This . watcher = ( ( IObservable < object > ) e . NewValue ) . ObserveOn ( RxApp . MainThreadScheduler ) . Subscribe (
88+ This . watcher . Disposable = ( ( IObservable < object > ) e . NewValue ) . ObserveOn ( RxApp . MainThreadScheduler ) . Subscribe (
8589 x => Interaction . ExecuteActions ( This . resolvedSource , This . Actions , x ) ,
8690 ex =>
8791 {
@@ -94,13 +98,15 @@ protected static void onObservableChanged(DependencyObject sender, DependencyPro
9498 protected override void OnAttached ( )
9599 {
96100 base . OnAttached ( ) ;
97- this . SetResolvedSource ( this . ComputeResolvedSource ( ) ) ;
101+ this . setResolvedSource ( this . computeResolvedSource ( ) ) ;
98102 }
99103
100104 protected override void OnDetaching ( )
101105 {
102- this . SetResolvedSource ( null ) ;
106+ this . setResolvedSource ( null ) ;
103107 base . OnDetaching ( ) ;
108+
109+ watcher . Dispose ( ) ;
104110 }
105111 }
106112}
0 commit comments