c# wpf xaml dependency-properties ivalueconverter

c# - ¿Por qué obtengo DependencyProperty.UnsetValue al convertir un valor en un MultiBinding?



wpf xaml (1)

Tengo un IMultiValueConverter extremadamente simple que simplemente los dos valores de OR. En el siguiente ejemplo, quiero invertir el primer valor usando un inversor booleano igualmente simple.

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

y el inversor:

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 }

Cuando incluyo el boolInverter, el primer valor en MultiValueConverter se convierte en "DependencyProperty.UnsetValue". No hay problemas cuando no uso el convertidor (aparte de la lógica que estoy buscando, por supuesto).

¿Me estoy perdiendo de algo? Pasar por el depurador muestra que InverseBoolConverter invierte correctamente el valor que le paso, pero ese valor no se ''envía'' al MultiValueConverter.


Desde MSDN:

UnsetValue es un valor centinela que se utiliza para escenarios en los que el sistema de propiedades WPF no puede determinar un valor DependencyProperty solicitado. Se utiliza UnsetValue en lugar de referencia nula (Nothing en Visual Basic), porque la referencia nula podría ser un valor de propiedad válido, así como un DefaultValue válido (y de uso frecuente).

Lo que significa una de las siguientes cosas:

  • Utiliza una plantilla ( ControlTemplate o DataTemplate ) y el valor no tiene un DataSource configurado en el momento de cargarlo. Por lo tanto, golpeará su convertidor dos veces, primero con UnsetValue, segundo con el valor booleano; Así que no hay nada por lo que preocuparse;
  • Su Binding es incorrecto, lo que significa que el enlace no puede determinar un valor, lo que da como resultado UnsetValue. Debería ver una advertencia de forma propicia.

Además, no puedes combinar convertidores como lo haces. Así que probablemente sea eso.

Retire el convertidor en el enlace interno, ¡y debe ser reparado! :)

¡Espero que esto ayude!