Browse Source

Added MultiBinding.StringFormat + Relevant unit tests

pull/2385/head
OronDF343 7 years ago
parent
commit
d065568be9
  1. 17
      src/Markup/Avalonia.Markup/Data/MultiBinding.cs
  2. 81
      tests/Avalonia.Markup.UnitTests/Data/MultiBindingTests_Converters.cs

17
src/Markup/Avalonia.Markup/Data/MultiBinding.cs

@ -52,6 +52,11 @@ namespace Avalonia.Data
/// </summary>
public RelativeSource RelativeSource { get; set; }
/// <summary>
/// Gets or sets the string format.
/// </summary>
public string StringFormat { get; set; }
/// <inheritdoc/>
public InstancedBinding Initiate(
IAvaloniaObject target,
@ -84,13 +89,23 @@ namespace Avalonia.Data
private object ConvertValue(IList<object> values, Type targetType)
{
var converted = Converter.Convert(values, targetType, ConverterParameter, CultureInfo.CurrentCulture);
var culture = CultureInfo.CurrentCulture;
var converted = Converter.Convert(values, targetType, ConverterParameter, culture);
if (converted == AvaloniaProperty.UnsetValue && FallbackValue != null)
{
converted = FallbackValue;
}
// We only respect `StringFormat` if the type of the property we're assigning to will
// accept a string. Note that this is slightly different to WPF in that WPF only applies
// `StringFormat` for target type `string` (not `object`).
if (!string.IsNullOrWhiteSpace(StringFormat) &&
(targetType == typeof(string) || targetType == typeof(object)))
{
converted = string.Format(culture, StringFormat, converted);
}
return converted;
}
}

81
tests/Avalonia.Markup.UnitTests/Data/MultiBindingTests_Converters.cs

@ -0,0 +1,81 @@
// Copyright (c) The Avalonia Project. All rights reserved.
// Licensed under the MIT license. See license.md file in the project root for full license information.
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using Avalonia.Controls;
using Avalonia.Data;
using Avalonia.Data.Converters;
using Avalonia.Data.Core;
using Xunit;
namespace Avalonia.Markup.UnitTests.Data
{
public class MultiBindingTests_Converters
{
[Fact]
public void StringFormat_Should_Be_Applied()
{
var textBlock = new TextBlock
{
DataContext = new MultiBindingTests_Converters.Class1(),
};
var target = new MultiBinding
{
StringFormat = "Foo + Bar = {0}",
Converter = new SumOfDoublesConverter(),
Bindings =
{
new Binding(nameof(MultiBindingTests_Converters.Class1.Foo)),
new Binding(nameof(MultiBindingTests_Converters.Class1.Bar)),
}
};
textBlock.Bind(TextBlock.TextProperty, target);
Assert.Equal("Foo + Bar = 3", textBlock.Text);
}
[Fact]
public void StringFormat_Should_Not_Be_Applied_When_Binding_To_Non_String_Or_Object()
{
var textBlock = new TextBlock
{
DataContext = new MultiBindingTests_Converters.Class1(),
};
var target = new MultiBinding
{
StringFormat = "Hello {0}",
Converter = new SumOfDoublesConverter(),
Bindings =
{
new Binding(nameof(MultiBindingTests_Converters.Class1.Foo)),
new Binding(nameof(MultiBindingTests_Converters.Class1.Bar)),
}
};
textBlock.Bind(TextBlock.WidthProperty, target);
Assert.Equal(3.0, textBlock.Width);
}
private class SumOfDoublesConverter : IMultiValueConverter
{
public object Convert(IList<object> values, Type targetType, object parameter, CultureInfo culture)
{
return values.OfType<double>().Sum();
}
}
private class Class1
{
public double Foo { get; set; } = 1;
public double Bar { get; set; } = 2;
}
}
}
Loading…
Cancel
Save