1- using System . Windows ;
1+ using System ;
2+ using System . Windows ;
23using System . Windows . Interactivity ;
34
45namespace RegexDialog . Behaviors
56{
67 public class SimplePropertyBindingBehavior : Behavior < DependencyObject >
78 {
89 private readonly ExpressionEvaluator expressionEvaluator = new ExpressionEvaluator ( ) ;
10+ private string oldEventName = string . Empty ;
11+ private EventHandler < EventArgs > eventHandler ;
12+
13+ public SimplePropertyBindingBehavior ( )
14+ {
15+ eventHandler = new EventHandler < EventArgs > ( OnTriggerEvent ) ;
16+ }
917
1018 public string PropertyName
1119 {
@@ -19,13 +27,44 @@ public string PropertyName
1927
2028 public object Value
2129 {
22- get { return ( object ) GetValue ( ValueProperty ) ; }
30+ get { return GetValue ( ValueProperty ) ; }
2331 set { SetValue ( ValueProperty , value ) ; }
2432 }
2533
2634 // Using a DependencyProperty as the backing store for Value. This enables animation, styling, binding, etc...
2735 public static readonly DependencyProperty ValueProperty =
28- DependencyProperty . Register ( "Value" , typeof ( object ) , typeof ( SimplePropertyBindingBehavior ) , new PropertyMetadata ( null , DependencyPropertyChanged ) ) ;
36+ DependencyProperty . Register ( "Value" , typeof ( object ) , typeof ( SimplePropertyBindingBehavior ) , new FrameworkPropertyMetadata ( null , FrameworkPropertyMetadataOptions . BindsTwoWayByDefault , DependencyPropertyChanged ) ) ;
37+
38+ /// <summary>
39+ /// Set to false to disable the update of the view from the viewModel
40+ /// </summary>
41+ public bool UpdateViewFromViewModel
42+ {
43+ get { return ( bool ) GetValue ( UpdateViewFromViewModelProperty ) ; }
44+ set { SetValue ( UpdateViewFromViewModelProperty , value ) ; }
45+ }
46+
47+ // Using a DependencyProperty as the backing store for UpdateViewFromViewModel. This enables animation, styling, binding, etc...
48+ public static readonly DependencyProperty UpdateViewFromViewModelProperty =
49+ DependencyProperty . Register ( "UpdateViewFromViewModel" , typeof ( bool ) , typeof ( SimplePropertyBindingBehavior ) , new PropertyMetadata ( true ) ) ;
50+
51+ public string PropertyChangedTriggerEventName
52+ {
53+ get { return ( string ) GetValue ( PropertyChangedTriggerEventNameProperty ) ; }
54+ set { SetValue ( PropertyChangedTriggerEventNameProperty , value ) ; }
55+ }
56+
57+ // Using a DependencyProperty as the backing store for PropertyChangedTriggerEventName. This enables animation, styling, binding, etc...
58+ public static readonly DependencyProperty PropertyChangedTriggerEventNameProperty =
59+ DependencyProperty . Register ( "PropertyChangedTriggerEventName" , typeof ( string ) , typeof ( SimplePropertyBindingBehavior ) , new PropertyMetadata ( string . Empty , PropertyChangedTriggerEventNameChanged ) ) ;
60+
61+ private static void PropertyChangedTriggerEventNameChanged ( DependencyObject dependencyObject , DependencyPropertyChangedEventArgs eventArgs )
62+ {
63+ if ( dependencyObject is SimplePropertyBindingBehavior simplePropertyBinding )
64+ {
65+ simplePropertyBinding . TriggerEventSubscribe ( ) ;
66+ }
67+ }
2968
3069 private static void DependencyPropertyChanged ( DependencyObject dependencyObject , DependencyPropertyChangedEventArgs eventArgs )
3170 {
@@ -39,22 +78,83 @@ protected override void OnAttached()
3978 {
4079 base . OnAttached ( ) ;
4180
81+ TriggerEventSubscribe ( ) ;
4282 UpdateValue ( ) ;
4383 }
4484
45- private void UpdateValue ( )
85+ protected override void OnDetaching ( )
86+ {
87+ base . OnDetaching ( ) ;
88+
89+ TriggerEventUnsubscribe ( ) ;
90+ }
91+
92+ private void TriggerEventSubscribe ( )
93+ {
94+ if ( AssociatedObject != null )
95+ {
96+ TriggerEventUnsubscribe ( ) ;
97+ if ( ! PropertyChangedTriggerEventName . Equals ( string . Empty ) )
98+ {
99+ oldEventName = PropertyChangedTriggerEventName ;
100+
101+ //WeakEventManager<type Final De l'objet, EventArgs>.AddHandler(AssociatedObject, PropertyChangedTriggerEventName, OnTriggerEvent);
102+ typeof ( WeakEventManager < , > )
103+ . MakeGenericType ( AssociatedObject . GetType ( ) , typeof ( EventArgs ) )
104+ . GetMethod ( "AddHandler" )
105+ . Invoke ( null , new object [ ] { AssociatedObject , PropertyChangedTriggerEventName , eventHandler } ) ;
106+ }
107+ }
108+ }
109+
110+ private void TriggerEventUnsubscribe ( )
111+ {
112+ if ( ! oldEventName . Equals ( string . Empty ) )
113+ {
114+ //WeakEventManager<type Final De l'objet, EventArgs>.RemoveHandler(AssociatedObject, PropertyChangedTriggerEventName, OnTriggerEvent);
115+ typeof ( WeakEventManager < , > )
116+ . MakeGenericType ( AssociatedObject . GetType ( ) , typeof ( EventArgs ) )
117+ . GetMethod ( "RemoveHandler" )
118+ . Invoke ( null , new object [ ] { AssociatedObject , oldEventName , eventHandler } ) ;
119+ }
120+ }
121+
122+ private void OnTriggerEvent ( object source , EventArgs args )
46123 {
47124 if ( ! PropertyName . Equals ( string . Empty ) )
48125 {
49126 try
50127 {
51128 expressionEvaluator . Variables [ "obj" ] = AssociatedObject ;
52- expressionEvaluator . Variables [ "value" ] = Value ; ;
53129
54- expressionEvaluator . Evaluate ( $ "obj.{ PropertyName } = value") ;
130+ object result = expressionEvaluator . Evaluate ( $ "obj.{ PropertyName } ") ;
131+
132+ if ( ! result . Equals ( Value ) )
133+ Value = result ;
55134 }
56135 catch { }
57136 }
58137 }
138+
139+ private void UpdateValue ( )
140+ {
141+ if ( UpdateViewFromViewModel && AssociatedObject != null && ! PropertyName . Equals ( string . Empty ) )
142+ {
143+ try
144+ {
145+ expressionEvaluator . Variables [ "obj" ] = AssociatedObject ;
146+ object result = expressionEvaluator . Evaluate ( $ "obj.{ PropertyName } ") ;
147+
148+ if ( ! result . Equals ( Value ) )
149+ {
150+ expressionEvaluator . Variables [ "value" ] = Value ;
151+
152+ expressionEvaluator . Evaluate ( $ "obj.{ PropertyName } = value") ;
153+ }
154+ }
155+ catch
156+ { }
157+ }
158+ }
59159 }
60160}
0 commit comments