2009-08-05 13 views
3

Je définis une propriété IsEnabled d'un contrôle basé sur si un SelectedIndex> = 0 dans un ListBox. Je peux faire ceci dans le code derrière, mais je voulais créer un convertisseur de valeur pour ce comportement puisque c'est quelque chose que je fais fréquemment.Qu'est-ce qui provoque le déclenchement d'un convertisseur de valeur?

J'ai créé cette valeur Converter pour gérer la tâche et lié à la propriété IsEnabled:

[ValueConversion(typeof(Selector), typeof(bool))] 
public class SelectorItemSelectedToBooleanConverter : IValueConverter 
{ 
    #region IValueConverter Members 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (value == null || !(value is Selector)) 
      return null; 

     var control = value as Selector; 
     return control.SelectedIndex >= 0; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 
} 

Le convertisseur est appelée une seule fois, lorsque l'application est chargée. Il ne se déclenche pas lorsque SelectedIndex change.

Ma question est donc de savoir ce qui déclenche un convertisseur de valeur? Je suppose que c'est quand les données liées changent, il y a donc un moyen de forcer le convertisseur à feu dans des circonstances différentes? Suis-je même poser la bonne question?

+0

pouvez-vous montrer votre liaison en xaml? SelectedIndex est la propriété de dépendance et devrait fonctionner –

+0

La liaison n'est pas à la propriété SelectedIndex, mais plutôt à la ListBox elle-même. Je suppose que vous avez déjà répondu à la question: le contrôle en lui-même n'est pas un dp et donc onyl fonctionnera probablement à chaque fois que son contenu change. –

Répondre

4

Il ne se déclenchera pas car vous l'avez lié au Selector lui-même, pas à la propriété SelectedIndex du Selector. WPF surveille toutes les propriétés du chemin auquel vous vous liez et met à jour les valeurs si l'une de ces propriétés est modifiée. Le Selector ne change pas, le SelectedIndex est.

+0

Quand j'ai lu le commentaire d'ArsenMkrt ci-dessus, je suis arrivé à la même conclusion. Je peux changer le convertisseur assez facilement: je pensais que ce serait utile pour l'un des types de sélecteur, et plus descriptif, mais ce que vous dites est logique. –

1

Je pense qu'un convertisseur pourrait être la mauvaise façon de procéder. Une meilleure solution serait d'utiliser un RoutedCommand et CanExecuted méthode vérifie de la commande pour voir si votre SelectedIndex est supérieur ou égal à 0.

Ce bien dit, si vous voulez continuer à utiliser votre valeur convertisseur, vous devez savoir que le convertisseur se déclenche à chaque mise à jour de la source de liaison. Vous pouvez modifier le comportement de la mise à jour à l'aide de la propriété UpdateSourceTrigger dans la liaison. Par défaut, il est défini sur PropertyChanged, mais pour les zones de texte, il est défini sur LostFocus (à chaque fois que la zone de texte perd le focus, la liaison est mise à jour).