Why do I get a DependencyProperty.UnsetValue when converting a value in a MultiBinding?

37,775

Solution 1

From MSDN:

UnsetValue is a sentinel value that is used for scenarios where the WPF property system is unable to determine a requested DependencyProperty value. UnsetValue is used rather than null reference (Nothing in Visual Basic), because null reference could be a valid property value, as well as a valid (and frequently used) DefaultValue.

Which means one of the following things:

  • You use a template (ControlTemplate or DataTemplate), and the value does not have a DataSource set at the time of being Loaded. So it will hit your converter twice, first with the UnsetValue, second with the boolean value; so nothing to worry about;
  • Your Binding is incorrect, meaning the Binding cannot determine a value, thus resulting in the UnsetValue.. You should propbably see a warning..

Also, you cannot combine Converters like you do.. So its probably that.

Remove the Converter in the inner Binding, and it should be fixed! :)

Hope this helps!

Solution 2

Just in addition to all other answers, I usually add these lines to the beginning of Convert method:

    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (values.Any(x => x == DependencyProperty.UnsetValue))
            return DependencyProperty.UnsetValue;

        ...

    }

to make sure that none of the values is unset (that usually happens with DataGrid with CanUserAddRows="True").

Share:
37,775
Erik Kerber
Author by

Erik Kerber

Principal iOS @ Target Writer and Editor @ raywenderlich.com Twitter GitHub LinkedIn

Updated on August 08, 2020

Comments

  • Erik Kerber
    Erik Kerber almost 4 years

    I have an extremely simple IMultiValueConverter that simply OR's two values. In the example below, I want to invert the first value using an equally simple boolean inverter.

    <MultiBinding Converter="{StaticResource multiBoolToVis}">
        <Binding Path="ConditionA" Converter="{StaticResource boolInverter}"/>
        <Binding Path="ConditionB"/>
    </MultiBinding>
    

    and the inverter:

    public class BoolInverterConverter : IValueConverter
    {
        #region IValueConverter Members
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            if (value is bool)
            {
                return !((bool)value);
            }
            return null;
        }
        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }
        #endregion
    }
    

    When I include the boolInverter, the first value in the MultiValueConverter becomes a "DependencyProperty.UnsetValue". There are no problems when I do not use the converter (other than not the logic I am aiming for, of course).

    Am I missing something? Stepping through the debugger shows that the InverseBoolConverter is properly inverting the value I pass it, but that value is then not being 'sent' to the MultiValueConverter.