Почему я получаю 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.
Ответы
Ответ 1
Из MSDN:
UnsetValue - это контрольное значение, которое используется для сценариев, в которых система свойств WPF не может определить запрашиваемое значение DependencyProperty. UnsetValue используется вместо нулевой ссылки (Nothing в Visual Basic), поскольку нулевая ссылка может быть допустимым значением свойства, а также действительным (и часто используемым) значением DefaultValue.
Это означает одну из следующих вещей:
- Вы используете шаблон (
ControlTemplate
или DataTemplate
), и значение не имеет набора данных, установленного во время загрузки. Таким образом, он дважды попадет в ваш конвертер, сначала с помощью UnsetValue, второй с логическим значением; так что не о чем беспокоиться;
- Ваш
Binding
неверен, что означает, что Binding не может определить значение, что приводит к UnsetValue. Вы должны с уверенностью видеть предупреждение..
Кроме того, вы не можете комбинировать преобразователи, как и вы. Поэтому, вероятно, это.
Удалите конвертер во внутреннем Binding, и он должен быть исправлен!:)
Надеюсь, это поможет!