Pourquoi dois-je obtenir un DependencyProperty.UnsetValue lors de la conversion d'une valeur dans un MultiBinding?

StackOverflow https://stackoverflow.com/questions/2811405

Question

J'ai un IMultiValueConverter extrêmement simple que deux valeurs affectez simplement. Dans l'exemple ci-dessous, je veux inverser la première valeur à l'aide d'un inverseur booléen tout aussi simple.

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

et l'onduleur:

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
}

Quand je l'boolInverter inclus, la première valeur de l'MultiValueConverter devient un « DependencyProperty.UnsetValue ». Il n'y a pas de problème quand je ne pas utiliser le convertisseur (autre que de ne pas la logique que je vise, bien sûr).

Est-ce que je manque quelque chose? Parcourant le débogueur montre que le InverseBoolConverter est correctement la valeur inverseuse je passe, mais cette valeur est alors pas « envoyé » au MultiValueConverter.

Était-ce utile?

La solution

De MSDN:

UnsetValue est une valeur sentinelle qui est utilisée pour les scénarios où le système de propriété WPF est incapable de déterminer une valeur DependencyProperty demandée. UnsetValue est utilisé au lieu de référence null (Nothing en Visual Basic), parce que référence null pourrait être une valeur de propriété valide, ainsi qu'un valide (et souvent utilisé) DefaultValue.

Ce qui signifie que l'une des choses suivantes:

  • Vous utilisez un modèle (ou ControlTemplate DataTemplate), et la valeur ne dispose pas d'un DataSource fixé au moment d'être chargé. Donc, il va frapper votre convertisseur deux fois, d'abord avec le UnsetValue, deuxième avec la valeur booléenne; donc rien à craindre;
  • Votre Binding est incorrect, ce qui signifie la liaison ne peut pas déterminer une valeur, entraînant ainsi la UnsetValue .. Vous devriez voir un avertissement propbably ..

En outre, vous ne pouvez pas combiner Converters comme vous le faites .. Donc, il est probablement que.

Retirez le convertisseur dans la liaison intérieure, et il devrait être fixé! :)

Hope this helps!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top