Skip to content
This repository was archived by the owner on Oct 16, 2020. It is now read-only.

Commit 6d1d189

Browse files
author
gumme
committed
BindingWrapper now supports MultiBinding and PriorityBinding.
1 parent 9744db9 commit 6d1d189

2 files changed

Lines changed: 121 additions & 4 deletions

File tree

src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/XamlDom/MarkupExtensionTests.cs

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@
1717
// DEALINGS IN THE SOFTWARE.
1818

1919
using System;
20+
using System.Windows;
21+
using System.Windows.Controls;
22+
using System.Windows.Data;
2023
using NUnit.Framework;
2124
using System.Windows.Markup;
2225
using ICSharpCode.WpfDesign.XamlDom;
@@ -118,6 +121,79 @@ public void TestQuotedPathWithCommasAndSpaces()
118121
{
119122
TestMarkupExtension("Content=\"{t:String '" + PathWithCommasAndSpaces + "'}\"");
120123
}
124+
125+
[Test]
126+
public void TestMultiBinding()
127+
{
128+
string xaml = @"
129+
<Window xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
130+
xmlns:t=""" + XamlTypeFinderTests.XamlDomTestsNamespace + @""">
131+
<TextBox>
132+
<MultiBinding>
133+
<MultiBinding.Converter>
134+
<t:MyMultiConverter />
135+
</MultiBinding.Converter>
136+
<Binding Path=""SomeProperty"" />
137+
</MultiBinding>
138+
</TextBox>
139+
</Window>";
140+
141+
TestLoading(xaml);
142+
143+
TestWindowMultiBinding((Window)XamlReader.Parse(xaml));
144+
145+
var doc = XamlParser.Parse(new StringReader(xaml));
146+
147+
TestWindowMultiBinding((Window)doc.RootInstance);
148+
}
149+
150+
151+
void TestWindowMultiBinding(Window w)
152+
{
153+
var textBox = (TextBox)w.Content;
154+
155+
var expr = BindingOperations.GetMultiBindingExpression(textBox, TextBox.TextProperty);
156+
Assert.IsNotNull(expr);
157+
158+
var converter = expr.ParentMultiBinding.Converter as MyMultiConverter;
159+
Assert.IsNotNull(converter);
160+
161+
Assert.AreEqual(expr.ParentMultiBinding.Bindings.Count, 1);
162+
}
163+
164+
[Test]
165+
public void TestPriorityBinding()
166+
{
167+
string xaml = @"
168+
<Window xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation""
169+
xmlns:t=""" + XamlTypeFinderTests.XamlDomTestsNamespace + @""">
170+
<TextBox>
171+
<PriorityBinding>
172+
<Binding Path=""SomeProperty"" />
173+
<Binding Path=""OtherProperty"" />
174+
</PriorityBinding>
175+
</TextBox>
176+
</Window>";
177+
178+
TestLoading(xaml);
179+
180+
TestWindowPriorityBinding((Window)XamlReader.Parse(xaml));
181+
182+
var doc = XamlParser.Parse(new StringReader(xaml));
183+
184+
TestWindowPriorityBinding((Window)doc.RootInstance);
185+
}
186+
187+
188+
void TestWindowPriorityBinding(Window w)
189+
{
190+
var textBox = (TextBox)w.Content;
191+
192+
var expr = BindingOperations.GetPriorityBindingExpression(textBox, TextBox.TextProperty);
193+
Assert.IsNotNull(expr);
194+
195+
Assert.AreEqual(expr.ParentPriorityBinding.Bindings.Count, 2);
196+
}
121197

122198
// [Test]
123199
// public void Test10()
@@ -177,4 +253,19 @@ public override object ProvideValue(IServiceProvider serviceProvider)
177253
return null;
178254
}
179255
}
256+
257+
public class MyMultiConverter : IMultiValueConverter
258+
{
259+
#region IMultiValueConverter implementation
260+
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
261+
{
262+
return System.Windows.DependencyProperty.UnsetValue;
263+
}
264+
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
265+
{
266+
throw new NotImplementedException();
267+
}
268+
#endregion
269+
270+
}
180271
}

src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlObject.cs

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
using System;
2020
using System.Collections.Generic;
21+
using System.Collections.ObjectModel;
2122
using System.ComponentModel;
2223
using System.Diagnostics;
2324
using System.Linq;
@@ -548,19 +549,44 @@ class BindingWrapper : MarkupExtensionWrapper
548549
{
549550
public override object ProvideValue()
550551
{
551-
var target = XamlObject.Instance as Binding;
552+
var target = XamlObject.Instance as BindingBase;
553+
Debug.Assert(target != null);
552554
//TODO: XamlObject.Clone()
553-
var b = new Binding();
555+
var b = CopyBinding(target);
556+
return b.ProvideValue(XamlObject.ServiceProvider);
557+
}
558+
559+
BindingBase CopyBinding(BindingBase target)
560+
{
561+
BindingBase b;
562+
if (target != null) {
563+
b = (BindingBase)Activator.CreateInstance(target.GetType());
564+
} else {
565+
b = new Binding();
566+
}
567+
554568
foreach (PropertyDescriptor pd in TypeDescriptor.GetProperties(target)) {
555-
if (pd.IsReadOnly) continue;
569+
if (pd.IsReadOnly) {
570+
if (pd.Name.Equals("Bindings", StringComparison.Ordinal)) {
571+
var bindings = (Collection<BindingBase>)pd.GetValue(target);
572+
var newBindings = (Collection<BindingBase>)pd.GetValue(b);
573+
574+
foreach (var binding in bindings) {
575+
newBindings.Add(CopyBinding(binding));
576+
}
577+
}
578+
579+
continue;
580+
}
556581
try {
557582
var val1 = pd.GetValue(b);
558583
var val2 = pd.GetValue(target);
559584
if (object.Equals(val1, val2)) continue;
560585
pd.SetValue(b, val2);
561586
} catch {}
562587
}
563-
return b.ProvideValue(XamlObject.ServiceProvider);
588+
589+
return b;
564590
}
565591
}
566592

0 commit comments

Comments
 (0)