2010-05-11 7 views
23

Ich habe einen sehr einfachen IMultiValueConverter, der einfach zwei Werte OR. Im folgenden Beispiel möchte ich den ersten Wert mit einem ebenso einfachen booleschen Inverter invertieren.Warum erhalte ich DependencyProperty.UnsetValue, wenn ein Wert in einem MultiBinding konvertiert wird?

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

und der Wechselrichter:

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 
} 

Wenn ich die boolInverter, der erste Wert in dem MultiValueConverter umfassen ein "DependencyProperty.UnsetValue" wird. Es gibt keine Probleme, wenn ich den Konverter nicht verwende (außer natürlich nicht die Logik, die ich anstrebe).

Fehle ich etwas? Beim Durchlaufen des Debuggers wird angezeigt, dass der InverseBoolConverter den übergebenen Wert korrekt invertiert, dieser Wert wird jedoch nicht an den MultiValueConverter "gesendet".

+0

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

Antwort

25

Von MSDN:

UnsetValue ist ein Sentinel-Wert, der für Szenarien verwendet wird, wo das WPF-Eigenschaftensystem kann einen angeforderte DependencyProperty Wert bestimmen. UnsetValue wird anstelle von NULL-Verweis (Nothing in Visual Basic) verwendet, da der NULL-Verweis ein gültiger Eigenschaftswert sowie ein gültiger (und häufig verwendeter) DefaultValue sein kann.

Welche der folgenden Dinge bedeutet:

  • Sie verwenden eine Vorlage (ControlTemplate oder DataTemplate), und der Wert nicht eine Datasource zu dem Zeitpunkt eingestellt hat Loaded zu werden. Also wird es Ihren Konverter zweimal treffen, zuerst mit dem UnsetValue, zweitens mit dem booleschen Wert; also nichts, worüber man sich Sorgen machen müsste;
  • Ihre Binding ist falsch, kann die Bindung bedeutet einen Wert nicht bestimmen, so dass in der UnsetValue resultierende .. Sie sollten propbably eine Warnung ..

Außerdem können Sie kombinieren Konverter nicht, wie Sie tun .. So sein wahrscheinlich das.

Entfernen Sie den Konverter in der inneren Bindung, und es sollte behoben werden! :)

Hoffe, das hilft!

+0

Wirklich? Also müsste ich eine Spiegeleigenschaft haben, "InverseConditionA", um zu tun, was ich versuche? Yuck! –

+0

Ja, oder erweitern Sie Ihren MultiValueConverter mit Parametern, um den ersten booleschen Wert zu invertieren? – Arcturus

+0

Wie kann ich überprüfen, ob ein bestimmter 'Wert' im Konverter dependencyproperty.unsetvalue hat? Ich meine, wenn ich den Wert auf Int werfen möchte, wird es einen Fehler wie (Int32) -Wert werfen - als Wert ist dependenceproperty.unsetvalue. irgendeine Idee? – Rohit