Browse Source

Added binding ConverterParameter.

Closes #317.
pull/335/head
Steven Kirk 10 years ago
parent
commit
b9992c582c
  1. 8
      src/Markup/Perspex.Markup.Xaml/Data/Binding.cs
  2. 2
      src/Markup/Perspex.Markup.Xaml/MarkupExtensions/BindingExtension.cs
  3. 25
      src/Markup/Perspex.Markup/Data/ExpressionSubject.cs
  4. 45
      tests/Perspex.Markup.UnitTests/Data/ExpressionSubjectTests.cs
  5. 4
      tests/Perspex.Markup.UnitTests/Perspex.Markup.UnitTests.csproj
  6. 1
      tests/Perspex.Markup.UnitTests/packages.config
  7. 18
      tests/Perspex.Markup.Xaml.UnitTests/Data/BindingTests.cs

8
src/Markup/Perspex.Markup.Xaml/Data/Binding.cs

@ -19,6 +19,11 @@ namespace Perspex.Markup.Xaml.Data
/// </summary>
public IValueConverter Converter { get; set; }
/// <summary>
/// Gets or sets a parameter to pass to <see cref="Converter"/>.
/// </summary>
public object ConverterParameter { get; set; }
/// <summary>
/// Gets or sets the name of the element to use as the binding source.
/// </summary>
@ -115,7 +120,8 @@ namespace Perspex.Markup.Xaml.Data
return new ExpressionSubject(
observer,
targetType,
Converter ?? DefaultValueConverter.Instance);
Converter ?? DefaultValueConverter.Instance,
ConverterParameter);
}
/// <summary>

2
src/Markup/Perspex.Markup.Xaml/MarkupExtensions/BindingExtension.cs

@ -22,6 +22,7 @@ namespace Perspex.Markup.Xaml.MarkupExtensions
return new Binding
{
Converter = Converter,
ConverterParameter = ConverterParameter,
ElementName = ElementName,
Mode = Mode,
Path = Path,
@ -29,6 +30,7 @@ namespace Perspex.Markup.Xaml.MarkupExtensions
}
public IValueConverter Converter { get; set; }
public object ConverterParameter { get; set; }
public string ElementName { get; set; }
public BindingMode Mode { get; set; }
public string Path { get; set; }

25
src/Markup/Perspex.Markup/Data/ExpressionSubject.cs

@ -34,7 +34,12 @@ namespace Perspex.Markup.Data
/// <param name="inner">The <see cref="ExpressionObserver"/>.</param>
/// <param name="targetType">The type to convert the value to.</param>
/// <param name="converter">The value converter to use.</param>
public ExpressionSubject(ExpressionObserver inner, Type targetType, IValueConverter converter)
/// <param name="converterParameter">A parameter to pass to <paramref name="converter"/>.</param>
public ExpressionSubject(
ExpressionObserver inner,
Type targetType,
IValueConverter converter,
object converterParameter = null)
{
Contract.Requires<ArgumentNullException>(inner != null);
Contract.Requires<ArgumentNullException>(targetType != null);
@ -43,6 +48,7 @@ namespace Perspex.Markup.Data
_inner = inner;
_targetType = targetType;
Converter = converter;
ConverterParameter = converterParameter;
}
/// <summary>
@ -50,6 +56,11 @@ namespace Perspex.Markup.Data
/// </summary>
public IValueConverter Converter { get; }
/// <summary>
/// Gets a parameter to pass to <see cref="Converter"/>.
/// </summary>
public object ConverterParameter { get; }
/// <inheritdoc/>
string IDescription.Description => _inner.Expression;
@ -70,7 +81,11 @@ namespace Perspex.Markup.Data
if (type != null)
{
var converted = Converter.ConvertBack(value, type, null, CultureInfo.CurrentUICulture);
var converted = Converter.ConvertBack(
value,
type,
ConverterParameter,
CultureInfo.CurrentUICulture);
if (converted == PerspexProperty.UnsetValue)
{
@ -85,7 +100,11 @@ namespace Perspex.Markup.Data
public IDisposable Subscribe(IObserver<object> observer)
{
return _inner
.Select(x => Converter.Convert(x, _targetType, null, CultureInfo.CurrentUICulture))
.Select(x => Converter.Convert(
x,
_targetType,
ConverterParameter,
CultureInfo.CurrentUICulture))
.Subscribe(observer);
}
}

45
tests/Perspex.Markup.UnitTests/Data/ExpressionSubjectTests.cs

@ -1,7 +1,11 @@
// Copyright (c) The Perspex Project. All rights reserved.
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using System.ComponentModel;
using System.Globalization;
using System.Reactive.Linq;
using Moq;
using Perspex.Markup.Data;
using Xunit;
@ -125,11 +129,50 @@ namespace Perspex.Markup.UnitTests.Data
Assert.Equal(0, data.DoubleValue);
}
private class Class1
[Fact]
public void Should_Pass_ConverterParameter_To_Convert()
{
var data = new Class1 { DoubleValue = 5.6 };
var converter = new Mock<IValueConverter>();
var target = new ExpressionSubject(
new ExpressionObserver(data, "DoubleValue"),
typeof(string),
converter.Object,
"foo");
target.Subscribe(_ => { });
converter.Verify(x => x.Convert(5.6, typeof(string), "foo", CultureInfo.CurrentUICulture));
}
[Fact]
public void Should_Pass_ConverterParameter_To_ConvertBack()
{
var data = new Class1 { DoubleValue = 5.6 };
var converter = new Mock<IValueConverter>();
var target = new ExpressionSubject(
new ExpressionObserver(data, "DoubleValue"),
typeof(string),
converter.Object,
"foo");
target.OnNext("bar");
converter.Verify(x => x.ConvertBack("bar", typeof(double), "foo", CultureInfo.CurrentUICulture));
}
private class Class1 : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public string StringValue { get; set; }
public double DoubleValue { get; set; }
public void RaisePropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}

4
tests/Perspex.Markup.UnitTests/Perspex.Markup.UnitTests.csproj

@ -39,6 +39,10 @@
<Private>True</Private>
</Reference>
<Reference Include="Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
<Reference Include="Moq, Version=4.2.1507.118, Culture=neutral, PublicKeyToken=69f491c39445e920, processorArchitecture=MSIL">
<HintPath>..\..\packages\Moq.4.2.1507.0118\lib\net40\Moq.dll</HintPath>
<Private>True</Private>
</Reference>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Reactive.Core, Version=2.2.5.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">

1
tests/Perspex.Markup.UnitTests/packages.config

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Moq" version="4.2.1507.0118" targetFramework="net46" />
<package id="Rx-Core" version="2.2.5" targetFramework="net46" />
<package id="Rx-Interfaces" version="2.2.5" targetFramework="net46" />
<package id="Rx-Linq" version="2.2.5" targetFramework="net46" />

18
tests/Perspex.Markup.Xaml.UnitTests/Data/BindingTests.cs

@ -2,6 +2,7 @@
// Licensed under the MIT license. See licence.md file in the project root for full license information.
using System;
using System.Globalization;
using System.Reactive.Linq;
using System.Reactive.Subjects;
using Moq;
@ -169,6 +170,23 @@ namespace Perspex.Markup.Xaml.UnitTests.Data
Assert.Same(converter.Object, ((ExpressionSubject)result).Converter);
}
[Fact]
public void Should_Pass_ConverterParameter_To_Supplied_Converter()
{
var target = CreateTarget();
var converter = new Mock<IValueConverter>();
var binding = new Binding
{
Converter = converter.Object,
ConverterParameter = "foo",
Path = "Bar",
};
var result = binding.CreateSubject(target.Object, TextBox.TextProperty.PropertyType);
Assert.Same("foo", ((ExpressionSubject)result).ConverterParameter);
}
/// <summary>
/// Tests a problem discovered with ListBox with selection.
/// </summary>

Loading…
Cancel
Save