Browse Source

Merge overridden direct property metadata.

pull/830/head
Steven Kirk 10 years ago
parent
commit
a0a201006f
  1. 18
      src/Avalonia.Base/DirectProperty.cs
  2. 9
      src/Avalonia.Base/DirectPropertyMetadata`1.cs
  3. 2
      src/Avalonia.Base/IDirectPropertyMetadata.cs
  4. 29
      tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Direct.cs
  5. 2
      tests/Avalonia.Base.UnitTests/DirectPropertyTests.cs

18
src/Avalonia.Base/DirectProperty.cs

@ -30,7 +30,7 @@ namespace Avalonia
string name, string name,
Func<TOwner, TValue> getter, Func<TOwner, TValue> getter,
Action<TOwner, TValue> setter, Action<TOwner, TValue> setter,
PropertyMetadata metadata) DirectPropertyMetadata<TValue> metadata)
: base(name, typeof(TOwner), metadata) : base(name, typeof(TOwner), metadata)
{ {
Contract.Requires<ArgumentNullException>(getter != null); Contract.Requires<ArgumentNullException>(getter != null);
@ -50,7 +50,7 @@ namespace Avalonia
AvaloniaProperty<TValue> source, AvaloniaProperty<TValue> source,
Func<TOwner, TValue> getter, Func<TOwner, TValue> getter,
Action<TOwner, TValue> setter, Action<TOwner, TValue> setter,
PropertyMetadata metadata) DirectPropertyMetadata<TValue> metadata)
: base(source, typeof(TOwner), metadata) : base(source, typeof(TOwner), metadata)
{ {
Contract.Requires<ArgumentNullException>(getter != null); Contract.Requires<ArgumentNullException>(getter != null);
@ -93,18 +93,22 @@ namespace Avalonia
Func<TNewOwner, TValue> getter, Func<TNewOwner, TValue> getter,
Action<TNewOwner, TValue> setter = null, Action<TNewOwner, TValue> setter = null,
TValue unsetValue = default(TValue), TValue unsetValue = default(TValue),
BindingMode defaultBindingMode = BindingMode.OneWay, BindingMode defaultBindingMode = BindingMode.Default,
bool enableDataValidation = false) bool enableDataValidation = false)
where TNewOwner : AvaloniaObject where TNewOwner : AvaloniaObject
{ {
var metadata = new DirectPropertyMetadata<TValue>(
unsetValue: unsetValue,
defaultBindingMode: defaultBindingMode,
enableDataValidation: enableDataValidation);
metadata.Merge(GetMetadata<TOwner>(), this);
var result = new DirectProperty<TNewOwner, TValue>( var result = new DirectProperty<TNewOwner, TValue>(
this, this,
getter, getter,
setter, setter,
new DirectPropertyMetadata<TValue>( metadata);
unsetValue: unsetValue,
defaultBindingMode: defaultBindingMode,
enableDataValidation: enableDataValidation));
AvaloniaPropertyRegistry.Instance.Register(typeof(TNewOwner), result); AvaloniaPropertyRegistry.Instance.Register(typeof(TNewOwner), result);
return result; return result;

9
src/Avalonia.Base/DirectPropertyMetadata`1.cs

@ -23,7 +23,7 @@ namespace Avalonia
public DirectPropertyMetadata( public DirectPropertyMetadata(
TValue unsetValue = default(TValue), TValue unsetValue = default(TValue),
BindingMode defaultBindingMode = BindingMode.Default, BindingMode defaultBindingMode = BindingMode.Default,
bool enableDataValidation = false) bool? enableDataValidation = null)
: base(defaultBindingMode) : base(defaultBindingMode)
{ {
UnsetValue = unsetValue; UnsetValue = unsetValue;
@ -44,7 +44,7 @@ namespace Avalonia
/// control (such as a TextBox's Text property) will be interested in recieving data /// 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. /// validation messages so this feature must be explicitly enabled by setting this flag.
/// </remarks> /// </remarks>
public bool EnableDataValidation { get; } public bool? EnableDataValidation { get; private set; }
/// <inheritdoc/> /// <inheritdoc/>
object IDirectPropertyMetadata.UnsetValue => UnsetValue; object IDirectPropertyMetadata.UnsetValue => UnsetValue;
@ -62,6 +62,11 @@ namespace Avalonia
{ {
UnsetValue = src.UnsetValue; UnsetValue = src.UnsetValue;
} }
if (EnableDataValidation == null)
{
EnableDataValidation = src.EnableDataValidation;
}
} }
} }
} }

2
src/Avalonia.Base/IDirectPropertyMetadata.cs

@ -16,6 +16,6 @@ namespace Avalonia
/// <summary> /// <summary>
/// Gets a value indicating whether the property is interested in data validation. /// Gets a value indicating whether the property is interested in data validation.
/// </summary> /// </summary>
bool EnableDataValidation { get; } bool? EnableDataValidation { get; }
} }
} }

29
tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Direct.cs

@ -4,6 +4,7 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reactive.Subjects; using System.Reactive.Subjects;
using Avalonia;
using Avalonia.Data; using Avalonia.Data;
using Avalonia.Logging; using Avalonia.Logging;
using Avalonia.UnitTests; using Avalonia.UnitTests;
@ -410,6 +411,34 @@ namespace Avalonia.Base.UnitTests
Assert.True(called); Assert.True(called);
} }
[Fact]
public void AddOwner_Should_Inherit_DefaultBindingMode()
{
var foo = new DirectProperty<Class1, string>(
"foo",
o => "foo",
null,
new DirectPropertyMetadata<string>(defaultBindingMode: BindingMode.TwoWay));
var bar = foo.AddOwner<Class2>(o => "bar");
Assert.Equal(BindingMode.TwoWay, bar.GetMetadata<Class1>().DefaultBindingMode);
Assert.Equal(BindingMode.TwoWay, bar.GetMetadata<Class2>().DefaultBindingMode);
}
[Fact]
public void AddOwner_Can_Override_DefaultBindingMode()
{
var foo = new DirectProperty<Class1, string>(
"foo",
o => "foo",
null,
new DirectPropertyMetadata<string>(defaultBindingMode: BindingMode.TwoWay));
var bar = foo.AddOwner<Class2>(o => "bar", defaultBindingMode: BindingMode.OneWayToSource);
Assert.Equal(BindingMode.TwoWay, bar.GetMetadata<Class1>().DefaultBindingMode);
Assert.Equal(BindingMode.OneWayToSource, bar.GetMetadata<Class2>().DefaultBindingMode);
}
private class Class1 : AvaloniaObject private class Class1 : AvaloniaObject
{ {
public static readonly DirectProperty<Class1, string> FooProperty = public static readonly DirectProperty<Class1, string> FooProperty =

2
tests/Avalonia.Base.UnitTests/DirectPropertyTests.cs

@ -34,7 +34,7 @@ namespace Avalonia.Base.UnitTests
"test", "test",
o => null, o => null,
null, null,
new PropertyMetadata()); new DirectPropertyMetadata<string>());
Assert.True(target.IsDirect); Assert.True(target.IsDirect);
} }

Loading…
Cancel
Save