WPF ValueConverter – Retour standard pour une valeur non convertible

Au cours de la dernière année, j’ai vu de nombreux convertisseurs de valeur différents à des fins différentes, provenant de nombreux auteurs différents. Une chose qui ressort dans mon esprit est la grande variance des valeurs «par défaut» qui leur sont renvoyées. Par exemple;

public class MyConverter: IValueConverter { public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { // OK, we test for some undesirable, unconvertable situation, typically null... if (value == null) { // And here are a variety of 'defaults' that I have seen, these begin the most typical. return null; return DependencyProperty.UnsetValue; return Binding.DoNothing; } //...... other code.. whatever... }} 

Donc, ma question est la suivante: existe-t-il un moyen «standard» d’indiquer qu’une valeur d’entrée ne peut pas être convertie?

Selon MSDN – IValueConverter :

Le moteur de liaison de données n’accepte pas les exceptions lancées par un convertisseur fourni par l’utilisateur. Toute exception déclenchée par la méthode Convert ou toute exception non interceptée déclenchée par des méthodes appelées par la méthode Convert est traitée comme une erreur d’exécution. Gérez les problèmes anticipés en renvoyant DependencyProperty.UnsetValue .

La ligne clé est Gérer les problèmes anticipés en renvoyant DependencyProperty.UnsetValue.

Lorsque vous regardez ces valeurs, vous découvrirez ce qu’elles signifient. Ensuite, choisissez le bon pour retourner dans votre convertisseur.

Le principal problème est que null peut être une valeur valide pour la propriété.

DependencyProperty.UnsetValue pour indiquer que la propriété existe, mais que sa valeur n’est pas définie par le système de propriétés

Binding.DoNothing pour indiquer au moteur de liaison de ne pas transférer une valeur à la cible de liaison, de ne pas passer à la prochaine liaison dans un paramètre PriorityBinding ou de ne pas utiliser la valeur FallBackValue ou la valeur par défaut

MODIFIER

Pour indiquer que vous ne pouvez pas convertir la valeur, vous devez simplement renvoyer la valeur donnée. C’est ce que vous pouvez faire de mieux car cela renvoie le problème à l’auteur de la liaison. Si vous vous mêlez de la valeur, il devient très difficile de savoir ce qui se passe.

Après beaucoup de reflection et de recherche, il semble que DependencyProperty.UnsetValue soit le choix approprié. J’ai tout déplacé en interne avec ce modèle avec beaucoup de succès. En outre, le texte dans la section “Remarques” de cette page indique que ceci est probablement le meilleur choix.

Il y a aussi une discussion sur le retour de la valeur d’entrée si une liaison ne peut pas être convertie, mais cela peut facilement “casser” le système de liaison. Pensez à un cas où l’entrée de liaison est une «chaîne» et la sortie est un «pinceau». Retourner une chaîne ne va pas fonctionner!

ce que vous retournez par défaut dépend de la situation. Vous ne voulez pas renvoyer un int comme valeur par défaut pour un convertisseur à un bool, ou renvoyer un bool pour un convertisseur pour l’énumération de visibilité.

Habituellement, si une valeur ne peut pas être convertie, je lance une Exception

En effet, si j’essaie de convertir une valeur à l’aide d’un convertisseur non valide, j’aimerais en être averti afin de pouvoir modifier mon code.

Dans certains cas rares, une valeur peut être valide même si elle ne peut pas être convertie. Dans ce cas, je retourne généralement la même valeur que celle transmise au convertisseur. Ceci est seulement utilisé si je veux que la valeur soit convertie si possible, ou pour restr le même sinon.

Un autre cas rare que j’ai fait à l’occasion est le codage en dur d’une valeur par défaut. Cela se fait généralement lorsque je sais que le convertisseur peut être utilisé avec un paramètre non valide, et je veux retourner une valeur valide, quel que soit le résultat. Mes convertisseurs par défaut codés en dur renvoient presque toujours des valeurs booléennes.

Je ne pense pas avoir retourné l’un des 3 que vous avez spécifiés ( null , DependencyProperty.UnsetValue ou Binding.DoNothing ) car ces valeurs sont souvent inattendues et difficiles à remarquer, sauf si vous les recherchez spécifiquement.

Vous pouvez également renvoyer un object par défaut targetType en utilisant cette fonction:

 public static object GetDefault(Type type) { if(type.IsValueType) { return Activator.CreateInstance(type); } return null; } 

Source: C # – équivalent programmatique du défaut (type)