diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/XamlDom/MarkupExtensionTests.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/XamlDom/MarkupExtensionTests.cs index cfe333f062..9a74644b5f 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/XamlDom/MarkupExtensionTests.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.Designer/Tests/XamlDom/MarkupExtensionTests.cs @@ -17,6 +17,9 @@ // DEALINGS IN THE SOFTWARE. using System; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; using NUnit.Framework; using System.Windows.Markup; using ICSharpCode.WpfDesign.XamlDom; @@ -118,6 +121,79 @@ namespace ICSharpCode.WpfDesign.Tests.XamlDom { TestMarkupExtension("Content=\"{t:String '" + PathWithCommasAndSpaces + "'}\""); } + + [Test] + public void TestMultiBinding() + { + string xaml = @" + + + + + + + + + +"; + + TestLoading(xaml); + + TestWindowMultiBinding((Window)XamlReader.Parse(xaml)); + + var doc = XamlParser.Parse(new StringReader(xaml)); + + TestWindowMultiBinding((Window)doc.RootInstance); + } + + + void TestWindowMultiBinding(Window w) + { + var textBox = (TextBox)w.Content; + + var expr = BindingOperations.GetMultiBindingExpression(textBox, TextBox.TextProperty); + Assert.IsNotNull(expr); + + var converter = expr.ParentMultiBinding.Converter as MyMultiConverter; + Assert.IsNotNull(converter); + + Assert.AreEqual(expr.ParentMultiBinding.Bindings.Count, 1); + } + + [Test] + public void TestPriorityBinding() + { + string xaml = @" + + + + + + + +"; + + TestLoading(xaml); + + TestWindowPriorityBinding((Window)XamlReader.Parse(xaml)); + + var doc = XamlParser.Parse(new StringReader(xaml)); + + TestWindowPriorityBinding((Window)doc.RootInstance); + } + + + void TestWindowPriorityBinding(Window w) + { + var textBox = (TextBox)w.Content; + + var expr = BindingOperations.GetPriorityBindingExpression(textBox, TextBox.TextProperty); + Assert.IsNotNull(expr); + + Assert.AreEqual(expr.ParentPriorityBinding.Bindings.Count, 2); + } // [Test] // public void Test10() @@ -177,4 +253,19 @@ namespace ICSharpCode.WpfDesign.Tests.XamlDom return null; } } + + public class MyMultiConverter : IMultiValueConverter + { + #region IMultiValueConverter implementation + public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) + { + return System.Windows.DependencyProperty.UnsetValue; + } + public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) + { + throw new NotImplementedException(); + } + #endregion + + } } diff --git a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlObject.cs b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlObject.cs index e8275a34e4..0429d5192c 100644 --- a/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlObject.cs +++ b/src/AddIns/DisplayBindings/WpfDesign/WpfDesign.XamlDom/Project/XamlObject.cs @@ -18,6 +18,7 @@ using System; using System.Collections.Generic; +using System.Collections.ObjectModel; using System.ComponentModel; using System.Diagnostics; using System.Linq; @@ -548,11 +549,35 @@ namespace ICSharpCode.WpfDesign.XamlDom { public override object ProvideValue() { - var target = XamlObject.Instance as Binding; + var target = XamlObject.Instance as BindingBase; + Debug.Assert(target != null); //TODO: XamlObject.Clone() - var b = new Binding(); + var b = CopyBinding(target); + return b.ProvideValue(XamlObject.ServiceProvider); + } + + BindingBase CopyBinding(BindingBase target) + { + BindingBase b; + if (target != null) { + b = (BindingBase)Activator.CreateInstance(target.GetType()); + } else { + b = new Binding(); + } + foreach (PropertyDescriptor pd in TypeDescriptor.GetProperties(target)) { - if (pd.IsReadOnly) continue; + if (pd.IsReadOnly) { + if (pd.Name.Equals("Bindings", StringComparison.Ordinal)) { + var bindings = (Collection)pd.GetValue(target); + var newBindings = (Collection)pd.GetValue(b); + + foreach (var binding in bindings) { + newBindings.Add(CopyBinding(binding)); + } + } + + continue; + } try { var val1 = pd.GetValue(b); var val2 = pd.GetValue(target); @@ -560,7 +585,8 @@ namespace ICSharpCode.WpfDesign.XamlDom pd.SetValue(b, val2); } catch {} } - return b.ProvideValue(XamlObject.ServiceProvider); + + return b; } }