Browse Source

Merge pull request #1233 from AvaloniaUI/fixes/1218-setter-oneway-binding

Correctly clone binding in Style.
pull/1237/head
Steven Kirk 9 years ago
committed by GitHub
parent
commit
55b9b1369c
  1. 12
      src/Avalonia.Styling/Styling/Setter.cs
  2. 37
      tests/Avalonia.Styling.UnitTests/SetterTests.cs

12
src/Avalonia.Styling/Styling/Setter.cs

@ -141,20 +141,20 @@ namespace Avalonia.Styling
{ {
var description = style?.ToString(); var description = style?.ToString();
if (sourceInstance.Subject != null) if (sourceInstance.Mode == BindingMode.TwoWay || sourceInstance.Mode == BindingMode.OneWayToSource)
{ {
var activated = new ActivatedSubject(activator, sourceInstance.Subject, description); var activated = new ActivatedSubject(activator, sourceInstance.Subject, description);
cloned = new InstancedBinding(activated, sourceInstance.Mode, BindingPriority.StyleTrigger); cloned = new InstancedBinding(activated, sourceInstance.Mode, BindingPriority.StyleTrigger);
} }
else if (sourceInstance.Observable != null) else if (sourceInstance.Mode == BindingMode.OneTime)
{ {
var activated = new ActivatedObservable(activator, sourceInstance.Observable, description); var activated = new ActivatedValue(activator, sourceInstance.Value, description);
cloned = new InstancedBinding(activated, sourceInstance.Mode, BindingPriority.StyleTrigger); cloned = new InstancedBinding(activated, BindingMode.OneWay, BindingPriority.StyleTrigger);
} }
else else
{ {
var activated = new ActivatedValue(activator, sourceInstance.Value, description); var activated = new ActivatedObservable(activator, sourceInstance.Observable ?? sourceInstance.Subject, description);
cloned = new InstancedBinding(activated, BindingMode.OneWay, BindingPriority.StyleTrigger); cloned = new InstancedBinding(activated, sourceInstance.Mode, BindingPriority.StyleTrigger);
} }
} }
else else

37
tests/Avalonia.Styling.UnitTests/SetterTests.cs

@ -8,6 +8,9 @@ using Avalonia.Data;
using Xunit; using Xunit;
using System; using System;
using Avalonia.Controls.Templates; using Avalonia.Controls.Templates;
using Avalonia.Markup.Xaml.Data;
using Avalonia.Markup;
using System.Globalization;
namespace Avalonia.Styling.UnitTests namespace Avalonia.Styling.UnitTests
{ {
@ -61,5 +64,39 @@ namespace Avalonia.Styling.UnitTests
Assert.NotNull(NameScope.GetNameScope((Control)control.Child)); Assert.NotNull(NameScope.GetNameScope((Control)control.Child));
} }
[Fact]
public void Does_Not_Call_Converter_ConvertBack_On_OneWay_Binding()
{
var control = new Decorator { Name = "foo" };
var style = Mock.Of<IStyle>();
var binding = new Binding("Name", BindingMode.OneWay)
{
Converter = new TestConverter(),
RelativeSource = new RelativeSource(RelativeSourceMode.Self),
};
var setter = new Setter(Decorator.TagProperty, binding);
var activator = new BehaviorSubject<bool>(true);
setter.Apply(style, control, activator);
Assert.Equal("foobar", control.Tag);
// Issue #1218 caused TestConverter.ConvertBack to throw here.
activator.OnNext(false);
Assert.Null(control.Tag);
}
private class TestConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value.ToString() + "bar";
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
} }
} }

Loading…
Cancel
Save