Почему я получаю DependencyProperty.UnsetValue при преобразовании значения в MultiBinding? - PullRequest
28 голосов
/ 11 мая 2010

У меня есть чрезвычайно простой 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.

1 Ответ

31 голосов
/ 11 мая 2010

Из MSDN:

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

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

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

Кроме того, вы не можете комбинировать конвертеры так, как вы. Так что, вероятно, это так.

Снимите конвертер во внутренней обвязке, и он должен быть исправлен! :)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...