Browse Source

Added FallbackValue to MultiBinding.

Closes #411.
pull/413/head
Steven Kirk 11 years ago
parent
commit
9ecd558af1
  1. 20
      src/Markup/Perspex.Markup.Xaml/Data/MultiBinding.cs
  2. 30
      tests/Perspex.Markup.Xaml.UnitTests/Data/MultiBindingTests.cs

20
src/Markup/Perspex.Markup.Xaml/Data/MultiBinding.cs

@ -29,6 +29,11 @@ namespace Perspex.Markup.Xaml.Data
/// </summary>
public IMultiValueConverter Converter { get; set; }
/// <summary>
/// Gets or sets the value to use when the binding is unable to produce a value.
/// </summary>
public object FallbackValue { get; set; }
/// <summary>
/// Gets or sets the binding mode.
/// </summary>
@ -75,8 +80,7 @@ namespace Perspex.Markup.Xaml.Data
var targetType = targetProperty?.PropertyType ?? typeof(object);
var result = new BehaviorSubject<object>(PerspexProperty.UnsetValue);
var children = Bindings.Select(x => x.CreateSubject(target, null));
var input = children.CombineLatest().Select(x =>
Converter.Convert(x, targetType, null, CultureInfo.CurrentUICulture));
var input = children.CombineLatest().Select(x => ConvertValue(x, targetType));
input.Subscribe(result);
return result;
}
@ -111,5 +115,17 @@ namespace Perspex.Markup.Xaml.Data
break;
}
}
private object ConvertValue(IList<object> values, Type targetType)
{
var converted = Converter.Convert(values, targetType, null, CultureInfo.CurrentUICulture);
if (converted == PerspexProperty.UnsetValue && FallbackValue != null)
{
converted = FallbackValue;
}
return converted;
}
}
}

30
tests/Perspex.Markup.Xaml.UnitTests/Data/MultiBindingTests.cs

@ -39,6 +39,28 @@ namespace Perspex.Markup.Xaml.UnitTests.Data
Assert.Equal("1,2,3", result);
}
[Fact]
public void Should_Return_FallbackValue_When_Converter_Returns_UnsetValue()
{
var target = new TextBlock();
var source = new { A = 1, B = 2, C = 3 };
var binding = new MultiBinding
{
Converter = new UnsetValueConverter(),
Bindings = new[]
{
new Binding { Path = "A" },
new Binding { Path = "B" },
new Binding { Path = "C" },
},
FallbackValue = "fallback",
};
target.Bind(TextBlock.TextProperty, binding);
Assert.Equal("fallback", target.Text);
}
private class ConcatConverter : IMultiValueConverter
{
public object Convert(IList<object> values, Type targetType, object parameter, CultureInfo culture)
@ -46,5 +68,13 @@ namespace Perspex.Markup.Xaml.UnitTests.Data
return string.Join(",", values);
}
}
private class UnsetValueConverter : IMultiValueConverter
{
public object Convert(IList<object> values, Type targetType, object parameter, CultureInfo culture)
{
return PerspexProperty.UnsetValue;
}
}
}
}

Loading…
Cancel
Save