|
|
@@ -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;
|
|
|
}
|
|
|
}
|
|
|
}
|