XAML Binding
<Label Content="{Binding BoundedValue , Converter={StaticResource valueIfNullConverter} , ConverterParameter={Binding DefaultNullValue}}"/>Converter
public class ValueIfNullConverter : IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return value ?? System.Convert.ToString(parameter); } }
Only to find this failing at runtime with the following exception:
A 'Binding' cannot be set on the 'ConverterParameter' property of type 'Binding'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.
This therefore implies the ConverterParameter property isn't exposed as a DependencyProperty and therefore can't be bound to.
To overcome this problem we can use a MultiBinding along with a multi-value converter whereby we bind the "values" of the converter to both the data source and converter parameter properties as follows:
<Label> <Label.Content> <MultiBinding Converter="{StaticResource valueIfNullConverter}"> <Binding Path="BoundedValue" /> <Binding Path="DefaultNullValue" /> </MultiBinding> </Label.Content> </Label>And changing our converter to a multi-value converter:
public class ValueIfNullConverter : IMultiValueConverter { public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (values != null && values.Length == 2) { return values[0] ?? System.Convert.ToString(values[1]); } return values; } }In the multi-value converter above, the bound value and parameter are now accessible inside the 'values' collection argument instead of accessing the parameter through the 'parameter' argument.
No comments:
Post a Comment