Browse Source

Merge overridden direct property metadata.

pull/830/head
Steven Kirk 9 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,
Func<TOwner, TValue> getter,
Action<TOwner, TValue> setter,
PropertyMetadata metadata)
DirectPropertyMetadata<TValue> metadata)
: base(name, typeof(TOwner), metadata)
{
Contract.Requires<ArgumentNullException>(getter != null);
@ -50,7 +50,7 @@ namespace Avalonia
AvaloniaProperty<TValue> source,
Func<TOwner, TValue> getter,
Action<TOwner, TValue> setter,
PropertyMetadata metadata)
DirectPropertyMetadata<TValue> metadata)
: base(source, typeof(TOwner), metadata)
{
Contract.Requires<ArgumentNullException>(getter != null);
@ -93,18 +93,22 @@ namespace Avalonia
Func<TNewOwner, TValue> getter,
Action<TNewOwner, TValue> setter = null,
TValue unsetValue = default(TValue),
BindingMode defaultBindingMode = BindingMode.OneWay,
BindingMode defaultBindingMode = BindingMode.Default,
bool enableDataValidation = false)
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>(
this,
getter,
setter,
new DirectPropertyMetadata<TValue>(
unsetValue: unsetValue,
defaultBindingMode: defaultBindingMode,
enableDataValidation: enableDataValidation));
metadata);
AvaloniaPropertyRegistry.Instance.Register(typeof(TNewOwner), result);
return result;

9
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.
/// </remarks>
public bool EnableDataValidation { get; }
public bool? EnableDataValidation { get; private set; }
/// <inheritdoc/>
object IDirectPropertyMetadata.UnsetValue => UnsetValue;
@ -62,6 +62,11 @@ namespace Avalonia
{
UnsetValue = src.UnsetValue;
}
if (EnableDataValidation == null)
{
EnableDataValidation = src.EnableDataValidation;
}
}
}
}

2
src/Avalonia.Base/IDirectPropertyMetadata.cs

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

29
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<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
{
public static readonly DirectProperty<Class1, string> FooProperty =

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

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

Loading…
Cancel
Save