Skip to content

Commit c9d98ec

Browse files
committed
Fix up lazy binding extension
1 parent a120a5a commit c9d98ec

File tree

1 file changed

+50
-21
lines changed

1 file changed

+50
-21
lines changed

Rubberduck.Core/UI/UnitTesting/LazyBindingExtension.cs

+50-21
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,27 @@
11
using System;
22
using System.ComponentModel;
33
using System.Globalization;
4+
using System.Windows;
45
using System.Windows.Data;
56
using System.Windows.Markup;
6-
using System.Windows;
77

88
namespace Rubberduck.UI.UnitTesting
99
{
10+
11+
// Source: https://stackoverflow.com/a/48202247/1419315
1012
[MarkupExtensionReturnType(typeof(object))]
1113
public class LazyBindingExtension : MarkupExtension
1214
{
13-
private Binding binding;
14-
private UIElement bindingTarget;
15-
private DependencyProperty bindingTargetProperty;
16-
1715
public LazyBindingExtension()
18-
{
19-
}
16+
{ }
2017

2118
public LazyBindingExtension(PropertyPath path) : this()
2219
{
2320
Path = path;
2421
}
2522

23+
#region Properties
24+
2625
public IValueConverter Converter { get; set; }
2726
[TypeConverter(typeof(CultureInfoIetfLanguageTagConverter))]
2827
public CultureInfo ConverterCulture { get; set; }
@@ -37,28 +36,35 @@ public LazyBindingExtension(PropertyPath path) : this()
3736
public bool ValidatesOnExceptions { get; set; }
3837
public bool ValidatesOnNotifyDataErrors { get; set; }
3938

39+
private Binding binding;
40+
private UIElement bindingTarget;
41+
private DependencyProperty bindingTargetProperty;
42+
43+
#endregion
44+
45+
#region Init
46+
4047
public override object ProvideValue(IServiceProvider serviceProvider)
4148
{
4249
var valueProvider = serviceProvider.GetService(typeof(IProvideValueTarget)) as IProvideValueTarget;
4350
if (valueProvider == null)
51+
{
4452
return null;
45-
53+
}
4654
bindingTarget = valueProvider.TargetObject as UIElement;
55+
4756
if (bindingTarget == null)
57+
{
4858
throw new NotSupportedException($"The target must be a UIElement, '{valueProvider.TargetObject}' is not valid.");
59+
}
4960

5061
bindingTargetProperty = valueProvider.TargetProperty as DependencyProperty;
62+
5163
if (bindingTargetProperty == null)
64+
{
5265
throw new NotSupportedException($"The target property must be a DependencyProperty, '{valueProvider.TargetProperty}' is not valid.");
66+
}
5367

54-
InitializeBinding();
55-
SetVisibilityHandler();
56-
57-
return this;
58-
}
59-
60-
private void InitializeBinding()
61-
{
6268
binding = new Binding
6369
{
6470
Path = Path,
@@ -67,31 +73,52 @@ private void InitializeBinding()
6773
ConverterParameter = ConverterParameter
6874
};
6975

70-
if (!string.IsNullOrEmpty(ElementName))
76+
if (ElementName != null)
77+
{
7178
binding.ElementName = ElementName;
79+
}
7280

7381
if (RelativeSource != null)
82+
{
7483
binding.RelativeSource = RelativeSource;
84+
}
7585

7686
if (Source != null)
87+
{
7788
binding.Source = Source;
89+
}
7890

7991
binding.UpdateSourceTrigger = UpdateSourceTrigger;
8092
binding.ValidatesOnDataErrors = ValidatesOnDataErrors;
8193
binding.ValidatesOnExceptions = ValidatesOnExceptions;
8294
binding.ValidatesOnNotifyDataErrors = ValidatesOnNotifyDataErrors;
95+
96+
return SetBinding();
8397
}
98+
8499

85-
private void SetVisibilityHandler()
100+
public object SetBinding()
86101
{
87-
bindingTarget.IsVisibleChanged += OnIsVisibleChanged;
102+
bindingTarget.IsVisibleChanged += UiElement_IsVisibleChanged;
103+
104+
UpdateBinding();
105+
106+
return bindingTarget.GetValue(bindingTargetProperty);
88107
}
89108

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)
91114
{
92115
UpdateBinding();
93116
}
94117

118+
#endregion
119+
120+
#region Update Binding
121+
95122
private void UpdateBinding()
96123
{
97124
if (bindingTarget.IsVisible && !IsBindingActive())
@@ -116,5 +143,7 @@ private void ClearBinding()
116143
if (IsBindingActive())
117144
BindingOperations.ClearBinding(bindingTarget, bindingTargetProperty);
118145
}
146+
147+
#endregion
119148
}
120-
}
149+
}

0 commit comments

Comments
 (0)