Подтвердить что ты не робот

Почему я получаю DependencyProperty.UnsetValue при преобразовании значения в MultiBinding?

У меня очень простой IMultiValueConverter, который просто ИЛИ два значения. В приведенном ниже примере я хочу инвертировать первое значение, используя одинаковый простой логический преобразователь.

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

и инвертор:

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
}

Когда я включаю boolInverter, первое значение в MultiValueConverter становится "DependencyProperty.UnsetValue". Нет проблем, когда я не использую конвертер (кроме логики, к которой я стремлюсь, конечно).

Я что-то упустил? Прохождение через отладчик показывает, что InverseBoolConverter правильно инвертирует значение, которое я передаю ему, но это значение затем не отправляется в MultiValueConverter.

4b9b3361

Ответ 1

Из MSDN:

UnsetValue - это контрольное значение, которое используется для сценариев, в которых система свойств WPF не может определить запрашиваемое значение DependencyProperty. UnsetValue используется вместо нулевой ссылки (Nothing в Visual Basic), поскольку нулевая ссылка может быть допустимым значением свойства, а также действительным (и часто используемым) значением DefaultValue.

Это означает одну из следующих вещей:

  • Вы используете шаблон (ControlTemplate или DataTemplate), и значение не имеет набора данных, установленного во время загрузки. Таким образом, он дважды попадет в ваш конвертер, сначала с помощью UnsetValue, второй с логическим значением; так что не о чем беспокоиться;
  • Ваш Binding неверен, что означает, что Binding не может определить значение, что приводит к UnsetValue. Вы должны с уверенностью видеть предупреждение..

Кроме того, вы не можете комбинировать преобразователи, как и вы. Поэтому, вероятно, это.

Удалите конвертер во внутреннем Binding, и он должен быть исправлен!:)

Надеюсь, это поможет!