|
|
|
@ -17,6 +17,7 @@ namespace Perspex.Markup.Data |
|
|
|
{ |
|
|
|
private readonly ExpressionObserver _inner; |
|
|
|
private readonly Type _targetType; |
|
|
|
private readonly object _fallbackValue; |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
/// Initializes a new instance of the <see cref="ExpressionObserver"/> class.
|
|
|
|
@ -34,12 +35,18 @@ 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>
|
|
|
|
/// <param name="converterParameter">A parameter to pass to <paramref name="converter"/>.</param>
|
|
|
|
/// <param name="converterParameter">
|
|
|
|
/// A parameter to pass to <paramref name="converter"/>.
|
|
|
|
/// </param>
|
|
|
|
/// <param name="fallbackValue">
|
|
|
|
/// The value to use when the binding is unable to produce a value.
|
|
|
|
/// </param>
|
|
|
|
public ExpressionSubject( |
|
|
|
ExpressionObserver inner, |
|
|
|
Type targetType, |
|
|
|
IValueConverter converter, |
|
|
|
object converterParameter = null) |
|
|
|
object converterParameter = null, |
|
|
|
object fallbackValue = null) |
|
|
|
{ |
|
|
|
Contract.Requires<ArgumentNullException>(inner != null); |
|
|
|
Contract.Requires<ArgumentNullException>(targetType != null); |
|
|
|
@ -49,6 +56,7 @@ namespace Perspex.Markup.Data |
|
|
|
_targetType = targetType; |
|
|
|
Converter = converter; |
|
|
|
ConverterParameter = converterParameter; |
|
|
|
_fallbackValue = fallbackValue; |
|
|
|
} |
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -99,13 +107,23 @@ namespace Perspex.Markup.Data |
|
|
|
/// <inheritdoc/>
|
|
|
|
public IDisposable Subscribe(IObserver<object> observer) |
|
|
|
{ |
|
|
|
return _inner |
|
|
|
.Select(x => Converter.Convert( |
|
|
|
x, |
|
|
|
_targetType, |
|
|
|
ConverterParameter, |
|
|
|
CultureInfo.CurrentUICulture)) |
|
|
|
.Subscribe(observer); |
|
|
|
return _inner.Select(ConvertValue).Subscribe(observer); |
|
|
|
} |
|
|
|
|
|
|
|
private object ConvertValue(object value) |
|
|
|
{ |
|
|
|
var converted = Converter.Convert( |
|
|
|
value, |
|
|
|
_targetType, |
|
|
|
ConverterParameter, |
|
|
|
CultureInfo.CurrentUICulture); |
|
|
|
|
|
|
|
if (converted == PerspexProperty.UnsetValue && _fallbackValue != null) |
|
|
|
{ |
|
|
|
converted = _fallbackValue; |
|
|
|
} |
|
|
|
|
|
|
|
return converted; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|