1
1
using System ;
2
2
using System . ComponentModel ;
3
3
using System . Globalization ;
4
+ using System . Windows ;
4
5
using System . Windows . Data ;
5
6
using System . Windows . Markup ;
6
- using System . Windows ;
7
7
8
8
namespace Rubberduck . UI . UnitTesting
9
9
{
10
+
11
+ // Source: https://stackoverflow.com/a/48202247/1419315
10
12
[ MarkupExtensionReturnType ( typeof ( object ) ) ]
11
13
public class LazyBindingExtension : MarkupExtension
12
14
{
13
- private Binding binding ;
14
- private UIElement bindingTarget ;
15
- private DependencyProperty bindingTargetProperty ;
16
-
17
15
public LazyBindingExtension ( )
18
- {
19
- }
16
+ { }
20
17
21
18
public LazyBindingExtension ( PropertyPath path ) : this ( )
22
19
{
23
20
Path = path ;
24
21
}
25
22
23
+ #region Properties
24
+
26
25
public IValueConverter Converter { get ; set ; }
27
26
[ TypeConverter ( typeof ( CultureInfoIetfLanguageTagConverter ) ) ]
28
27
public CultureInfo ConverterCulture { get ; set ; }
@@ -37,28 +36,35 @@ public LazyBindingExtension(PropertyPath path) : this()
37
36
public bool ValidatesOnExceptions { get ; set ; }
38
37
public bool ValidatesOnNotifyDataErrors { get ; set ; }
39
38
39
+ private Binding binding ;
40
+ private UIElement bindingTarget ;
41
+ private DependencyProperty bindingTargetProperty ;
42
+
43
+ #endregion
44
+
45
+ #region Init
46
+
40
47
public override object ProvideValue ( IServiceProvider serviceProvider )
41
48
{
42
49
var valueProvider = serviceProvider . GetService ( typeof ( IProvideValueTarget ) ) as IProvideValueTarget ;
43
50
if ( valueProvider == null )
51
+ {
44
52
return null ;
45
-
53
+ }
46
54
bindingTarget = valueProvider . TargetObject as UIElement ;
55
+
47
56
if ( bindingTarget == null )
57
+ {
48
58
throw new NotSupportedException ( $ "The target must be a UIElement, '{ valueProvider . TargetObject } ' is not valid.") ;
59
+ }
49
60
50
61
bindingTargetProperty = valueProvider . TargetProperty as DependencyProperty ;
62
+
51
63
if ( bindingTargetProperty == null )
64
+ {
52
65
throw new NotSupportedException ( $ "The target property must be a DependencyProperty, '{ valueProvider . TargetProperty } ' is not valid.") ;
66
+ }
53
67
54
- InitializeBinding ( ) ;
55
- SetVisibilityHandler ( ) ;
56
-
57
- return this ;
58
- }
59
-
60
- private void InitializeBinding ( )
61
- {
62
68
binding = new Binding
63
69
{
64
70
Path = Path ,
@@ -67,31 +73,52 @@ private void InitializeBinding()
67
73
ConverterParameter = ConverterParameter
68
74
} ;
69
75
70
- if ( ! string . IsNullOrEmpty ( ElementName ) )
76
+ if ( ElementName != null )
77
+ {
71
78
binding . ElementName = ElementName ;
79
+ }
72
80
73
81
if ( RelativeSource != null )
82
+ {
74
83
binding . RelativeSource = RelativeSource ;
84
+ }
75
85
76
86
if ( Source != null )
87
+ {
77
88
binding . Source = Source ;
89
+ }
78
90
79
91
binding . UpdateSourceTrigger = UpdateSourceTrigger ;
80
92
binding . ValidatesOnDataErrors = ValidatesOnDataErrors ;
81
93
binding . ValidatesOnExceptions = ValidatesOnExceptions ;
82
94
binding . ValidatesOnNotifyDataErrors = ValidatesOnNotifyDataErrors ;
95
+
96
+ return SetBinding ( ) ;
83
97
}
98
+
84
99
85
- private void SetVisibilityHandler ( )
100
+ public object SetBinding ( )
86
101
{
87
- bindingTarget . IsVisibleChanged += OnIsVisibleChanged ;
102
+ bindingTarget . IsVisibleChanged += UiElement_IsVisibleChanged ;
103
+
104
+ UpdateBinding ( ) ;
105
+
106
+ return bindingTarget . GetValue ( bindingTargetProperty ) ;
88
107
}
89
108
90
- private void OnIsVisibleChanged ( object sender , DependencyPropertyChangedEventArgs e )
109
+ #endregion
110
+
111
+ #region Event Handlers
112
+
113
+ private void UiElement_IsVisibleChanged ( object sender , DependencyPropertyChangedEventArgs e )
91
114
{
92
115
UpdateBinding ( ) ;
93
116
}
94
117
118
+ #endregion
119
+
120
+ #region Update Binding
121
+
95
122
private void UpdateBinding ( )
96
123
{
97
124
if ( bindingTarget . IsVisible && ! IsBindingActive ( ) )
@@ -116,5 +143,7 @@ private void ClearBinding()
116
143
if ( IsBindingActive ( ) )
117
144
BindingOperations . ClearBinding ( bindingTarget , bindingTargetProperty ) ;
118
145
}
146
+
147
+ #endregion
119
148
}
120
- }
149
+ }
0 commit comments