2010-05-11 10 views
23

Ho un IMultiValueConverter estremamente semplice che ha semplicemente due valori di OR. Nell'esempio seguente, voglio invertire il primo valore utilizzando un inverter booleano altrettanto semplice.Perché ottengo DependencyProperty.UnsetValue durante la conversione di un valore in una MultiBinding?

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

e l'inverter:

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 
} 

Quando includo il boolInverter, il primo valore nella MultiValueConverter diventa un "DependencyProperty.UnsetValue". Non ci sono problemi quando non uso il convertitore (a parte la logica che sto cercando, ovviamente).

mi sto perdendo qualcosa? Passando attraverso il debugger, l'InverseBoolConverter sta invertendo correttamente il valore che ho passato, ma quel valore non viene quindi "inviato" a MultiValueConverter.

+0

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

risposta

25

Da MSDN:

UnsetValue è un valore sentinella che viene utilizzato per scenari in cui il sistema di proprietà WPF non è in grado di determinare un valore DependencyProperty richiesto. UnsetValue viene utilizzato anziché riferimento null (Nothing in Visual Basic), poiché il riferimento null potrebbe essere un valore di proprietà valido, nonché un valore predefinito valido (e frequentemente utilizzato).

Il che significa che una delle seguenti cose:

  • si utilizza un modello (o ControlTemplateDataTemplate), e il valore non dispone di un DataSource stabilito al momento di essere caricato. Quindi colpirà il tuo convertitore due volte, prima con UnsetValue, il secondo con il valore booleano; quindi niente di cui preoccuparsi;
  • vostri Binding non sia corretta, cioè la rilegatura non può determinare un valore, conseguente alla UnsetValue .. Si dovrebbe propbably visualizzato un avviso ..

Inoltre, non può essere combinato convertitori come si fa .. Quindi la sua probabilmente quello

Rimuovere il convertitore nella rilegatura interna e deve essere riparato! :)

Spero che questo aiuti!

+0

Davvero? Quindi dovrei avere una proprietà mirror, "InverseConditionA", per fare ciò che sto provando? Che schifo! –

+0

Sì, o espandi il tuo MultiValueConverter con i parametri, per invertire il primo booleano? – Arcturus

+0

Come posso verificare se un particolare 'valore' nel convertitore ha dependencyproperty.unsetvalue? Voglio dire se voglio lanciare il valore su Int allora genererà un errore come (Int32) valore - come valore è dependencyproperty.unsetvalue. qualche idea? – Rohit

Problemi correlati