2010-05-11 4 views
23

Mam niezwykle prosty IMultiValueConverter, który po prostu dwie wartości OR. W poniższym przykładzie chcę odwrócić pierwszą wartość przy użyciu równie prostego falownika binarnego.Dlaczego otrzymuję wartość DependencyProperty.UnsetValue podczas przekształcania wartości w MultiBinding?

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

i falownik:

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 
} 

Kiedy obejmują boolInverter, pierwsza wartość w MultiValueConverter staje się "DependencyProperty.UnsetValue". Nie ma problemów, gdy nie używam konwertera (oczywiście inaczej niż logika, do której dążę).

Czy brakuje mi czegoś? Przechodzenie przez debugger pokazuje, że InverseBoolConverter poprawnie odwraca wartość, którą przekazuję, ale ta wartość nie jest następnie wysyłana do MultiValueConverter.

+0

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

Odpowiedz

25

Od MSDN:

UnsetValue jest wartością Sentinel, który jest używany w scenariuszach, w których system nieruchomość WPF nie jest w stanie określić żądaną wartość DependencyProperty. Wartość UnsetValue jest używana zamiast odwołania zerowego (Nic w języku Visual Basic), ponieważ odwołanie zerowe może być poprawną wartością właściwości, a także poprawną (i często używaną) wartością DefaultValue.

Co oznacza jedną z następujących czynności:

  • użyć szablonu (ControlTemplate lub DataTemplate), a wartość nie posiada DataSource ustawiony w momencie ładowany. Więc uderzy dwa razy w twój konwerter, najpierw z UnsetValue, po drugie z wartością boolean; więc nie ma się czym martwić;
  • Twoje Binding jest nieprawidłowe, co oznacza, że ​​nie można ustalić wiążące wartość, tym samym powodując UnsetValue .. Należy propbably zobaczyć ostrzeżenie ..

Ponadto, nie można łączyć Konwertery jak ty .. Więc jego prawdopodobnie to.

Wymontuj konwerter w wewnętrznej oprawce i należy go naprawić! :)

Mam nadzieję, że to pomoże!

+0

Naprawdę? Czy muszę więc mieć właściwość lustra "InverseConditionA", aby zrobić to, co próbuję? Fuj! –

+0

Tak, lub rozwinąć MultiValueConverter za pomocą parametrów, aby odwrócić pierwszy boolean? – Arcturus

+0

Jak mogę sprawdzić, czy konkretna "wartość" w konwerterze ma zależnośćproperty.unsetvalue? Mam na myśli, jeśli chcę rzucić wartość do Int wtedy to rzuci błąd jak (Int32) wartość - jako wartość jest dependencyproperty.unsetvalue. dowolny pomysł? – Rohit

Powiązane problemy