2009-08-05 8 views
0

Quel est le modèle typique d'affichage d'une valeur "indisponible" lors de la liaison de données dans WPF?Motif pour la valeur "indisponible" lors de la liaison de données dans WPF

Par exemple, j'utilise MVVM, et TextBlock s à mon avis sont liés aux propriétés de mon viewmodel, dont certaines sont int s. Il y a des moments où je veux afficher temporairement deux tirets ("-") dans ma vue plutôt que la valeur de la propriété.

Je peux changer la propriété pour qu'elle soit une chaîne, puis dans le getter ajouter une logique pour spécifier si elle retourne la valeur ou "-". C'est probablement la façon appropriée d'utiliser MVVM, mais existe-t-il des moyens plus faciles?

Existe-t-il un moyen de tirer parti d'un TextBlockFallbackValue? Ou existe-t-il une autre approche pour suspendre temporairement la liaison de données et afficher une valeur "indisponible"?

Répondre

3

FallbackValue est uniquement utilisé lorsque le chemin de liaison ne peut pas être résolu ou le convertisseur renvoie DependencyProperty.UnsetValue. Les convertisseurs sont généralement évités lors de l'exécution de MVVM. Ma suggestion serait d'avoir deux propriétés, qui contient la valeur int et qui contient la valeur d'affichage:

public int SomeValue 
{ 
    get { return _someValue; } 
    set 
    { 
     if (_someValue != value) 
     { 
      _someValue = value; 
      OnPropertyChanged("SomeValue"); 
      OnPropertyChanged("SomeValueDisplay"); 
     } 
    } 
} 

public string SomeValueDisplay 
{ 
    get { return _someValue == -1 ? "--" : _someValue.ToString(); } 
} 

Cela vous donne le meilleur des deux mondes. Votre logique VM fonctionne avec la propriété int, mais votre TextBlock se lie directement à une représentation string du sous-jacente int.

+0

'SomeValueDisplay' devrait être une chaîne, pas int –

+0

Merci pour votre réponse. Dans mon cas, je n'aurais pas vraiment besoin de la deuxième propriété - je peux juste changer ma propriété en une chaîne directement. –

+0

@Thomas: merci - édité. –

0

Depuis un TextBlock affiche déjà du texte, pourquoi ne pas ajouter simplement une coutume IMultiValueConverter à la liaison qui renvoie "--" en cas de, disons, une valeur bool sur la machine virtuelle?

0

WPF utilise déjà des convertisseurs en arrière-plan (tels que int pour string) pour afficher vos valeurs dans les blocs de texte. Si vous voulez changer la fonctionnalité, vous pouvez fournir un simple convertisseur personnalisé pour gérer tous les cas particuliers que vous pouvez imaginer.

0

vous pouvez utiliser un int nullable pour la propriété et dans la liaison spécifier TargetNullValue = -.

Si vous avez besoin de la valeur d'origine de toute façon, vous pouvez utiliser votre valeur int réelle comme magasin de sauvegarde et utiliser la logique pour déterminer si vous voulez retourner la valeur ou null.

Questions connexes