From a0a201006f255f6777acb4aed4cb6cc6e36045f1 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Wed, 4 Jan 2017 00:57:39 +0100 Subject: [PATCH] Merge overridden direct property metadata. --- src/Avalonia.Base/DirectProperty.cs | 18 +++++++----- src/Avalonia.Base/DirectPropertyMetadata`1.cs | 9 ++++-- src/Avalonia.Base/IDirectPropertyMetadata.cs | 2 +- .../AvaloniaObjectTests_Direct.cs | 29 +++++++++++++++++++ .../DirectPropertyTests.cs | 2 +- 5 files changed, 49 insertions(+), 11 deletions(-) diff --git a/src/Avalonia.Base/DirectProperty.cs b/src/Avalonia.Base/DirectProperty.cs index fad6cf983a..8352528285 100644 --- a/src/Avalonia.Base/DirectProperty.cs +++ b/src/Avalonia.Base/DirectProperty.cs @@ -30,7 +30,7 @@ namespace Avalonia string name, Func getter, Action setter, - PropertyMetadata metadata) + DirectPropertyMetadata metadata) : base(name, typeof(TOwner), metadata) { Contract.Requires(getter != null); @@ -50,7 +50,7 @@ namespace Avalonia AvaloniaProperty source, Func getter, Action setter, - PropertyMetadata metadata) + DirectPropertyMetadata metadata) : base(source, typeof(TOwner), metadata) { Contract.Requires(getter != null); @@ -93,18 +93,22 @@ namespace Avalonia Func getter, Action setter = null, TValue unsetValue = default(TValue), - BindingMode defaultBindingMode = BindingMode.OneWay, + BindingMode defaultBindingMode = BindingMode.Default, bool enableDataValidation = false) where TNewOwner : AvaloniaObject { + var metadata = new DirectPropertyMetadata( + unsetValue: unsetValue, + defaultBindingMode: defaultBindingMode, + enableDataValidation: enableDataValidation); + + metadata.Merge(GetMetadata(), this); + var result = new DirectProperty( this, getter, setter, - new DirectPropertyMetadata( - unsetValue: unsetValue, - defaultBindingMode: defaultBindingMode, - enableDataValidation: enableDataValidation)); + metadata); AvaloniaPropertyRegistry.Instance.Register(typeof(TNewOwner), result); return result; diff --git a/src/Avalonia.Base/DirectPropertyMetadata`1.cs b/src/Avalonia.Base/DirectPropertyMetadata`1.cs index d22801e35a..26de578a45 100644 --- a/src/Avalonia.Base/DirectPropertyMetadata`1.cs +++ b/src/Avalonia.Base/DirectPropertyMetadata`1.cs @@ -23,7 +23,7 @@ namespace Avalonia public DirectPropertyMetadata( TValue unsetValue = default(TValue), BindingMode defaultBindingMode = BindingMode.Default, - bool enableDataValidation = false) + bool? enableDataValidation = null) : base(defaultBindingMode) { UnsetValue = unsetValue; @@ -44,7 +44,7 @@ namespace Avalonia /// control (such as a TextBox's Text property) will be interested in recieving data /// validation messages so this feature must be explicitly enabled by setting this flag. /// - public bool EnableDataValidation { get; } + public bool? EnableDataValidation { get; private set; } /// object IDirectPropertyMetadata.UnsetValue => UnsetValue; @@ -62,6 +62,11 @@ namespace Avalonia { UnsetValue = src.UnsetValue; } + + if (EnableDataValidation == null) + { + EnableDataValidation = src.EnableDataValidation; + } } } } diff --git a/src/Avalonia.Base/IDirectPropertyMetadata.cs b/src/Avalonia.Base/IDirectPropertyMetadata.cs index 9dc014f0b8..c283855e5f 100644 --- a/src/Avalonia.Base/IDirectPropertyMetadata.cs +++ b/src/Avalonia.Base/IDirectPropertyMetadata.cs @@ -16,6 +16,6 @@ namespace Avalonia /// /// Gets a value indicating whether the property is interested in data validation. /// - bool EnableDataValidation { get; } + bool? EnableDataValidation { get; } } } \ No newline at end of file diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Direct.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Direct.cs index 7b7a949e7c..ecb555252d 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Direct.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Direct.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Reactive.Subjects; +using Avalonia; using Avalonia.Data; using Avalonia.Logging; using Avalonia.UnitTests; @@ -410,6 +411,34 @@ namespace Avalonia.Base.UnitTests Assert.True(called); } + [Fact] + public void AddOwner_Should_Inherit_DefaultBindingMode() + { + var foo = new DirectProperty( + "foo", + o => "foo", + null, + new DirectPropertyMetadata(defaultBindingMode: BindingMode.TwoWay)); + var bar = foo.AddOwner(o => "bar"); + + Assert.Equal(BindingMode.TwoWay, bar.GetMetadata().DefaultBindingMode); + Assert.Equal(BindingMode.TwoWay, bar.GetMetadata().DefaultBindingMode); + } + + [Fact] + public void AddOwner_Can_Override_DefaultBindingMode() + { + var foo = new DirectProperty( + "foo", + o => "foo", + null, + new DirectPropertyMetadata(defaultBindingMode: BindingMode.TwoWay)); + var bar = foo.AddOwner(o => "bar", defaultBindingMode: BindingMode.OneWayToSource); + + Assert.Equal(BindingMode.TwoWay, bar.GetMetadata().DefaultBindingMode); + Assert.Equal(BindingMode.OneWayToSource, bar.GetMetadata().DefaultBindingMode); + } + private class Class1 : AvaloniaObject { public static readonly DirectProperty FooProperty = diff --git a/tests/Avalonia.Base.UnitTests/DirectPropertyTests.cs b/tests/Avalonia.Base.UnitTests/DirectPropertyTests.cs index 7e40926679..3a37585dc0 100644 --- a/tests/Avalonia.Base.UnitTests/DirectPropertyTests.cs +++ b/tests/Avalonia.Base.UnitTests/DirectPropertyTests.cs @@ -34,7 +34,7 @@ namespace Avalonia.Base.UnitTests "test", o => null, null, - new PropertyMetadata()); + new DirectPropertyMetadata()); Assert.True(target.IsDirect); }