2010-05-11 6 views
23

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.¿Por qué obtengo DependencyProperty.UnsetValue al convertir un valor en un enlace múltiple?

<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 el MultiValueConverter se convierte en un "DependencyProperty.UnsetValue". No hay problemas cuando no uso el convertidor (aparte de la lógica que estoy buscando, por supuesto).

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

+0

ver este: http://stackoverflow.com/questions/683863/items-collection-must-be-empty-before-using-itemssource – mkb

Respuesta

25

De MSDN:

UnsetValue es un valor centinela que se utiliza para escenarios donde el sistema de propiedades de WPF no pueda 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 que una de las siguientes cosas:

  • se utiliza una plantilla (ControlTemplate o DataTemplate), y el valor no tiene un origen de datos establecido en el momento de ser cargado. 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;
  • Sus Binding es incorrecta, es decir, la unión no se puede determinar un valor, lo que resulta en la UnsetValue .. Debe propbably ver una advertencia ..

Además, puede no combinar convertidores como lo hace .. Por lo que su Probablemente eso.

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

Espero que esto ayude!

+0

¿De verdad? Entonces, ¿tendría que tener una propiedad espejo, "InverseConditionA", para hacer lo que estoy intentando? ¡Yuck! –

+0

Sí, o expanda su MultiValueConverter con parámetros, para invertir el primer booleano? – Arcturus

+0

¿Cómo puedo verificar si un 'valor' particular en el convertidor tiene dependencyproperty.unsetvalue? Quiero decir que si deseo convertir el valor a Int, arrojará un error como el valor (Int32), ya que el valor es dependencyproperty.unsetvalue. ¿alguna idea? – Rohit

Cuestiones relacionadas