Question

La façon la plus commune que je rencontrais de spécifier un convertisseur de valeur pour une liaison est de:
1. Créez une instance du convertisseur de valeur en tant que ressource avec une clé.
2. Référence de l'instance en utilisant l'extension de balisage StaticResource:

<TextBlock Text="{Binding Converter={StaticResource myFormatter}" />  

Q: Y at-il quelque chose de mal à utiliser instance statique comme suit:

<TextBlock Text="{Binding Path=Description, Converter={x:Static local:MyFormatter.Instance}}"/>

// where Instance is declared as:
public readonly static MyFormatter Instance = new MyFormatter();

Dans mon convertisseur cas de valeur est immuable.

Edit: tourner le convertisseur en une extension de sorte que vous spécifiez le convertisseur en utilisant le format d'extension de balisage:

<TextBlock Text="{Binding Converter={local:MyFormatter}}"/>
Était-ce utile?

La solution

Techniquement, il sera très bien, mais en pratique, je ne l'aime pas:

  1. Si vous déclarez le convertisseur comme une ressource, alors vous avez un seul point de référence. Si vous modifiez l'espace de noms ou le nom de classe du convertisseur, alors vous avez seulement un lieu unique de mettre à jour.

  2. Si vous déclarez comme statique, alors vous devez apporter le clr-namespace dans au sommet de chaque fichier XAML qui utilise le convertisseur. Si vous déclarez comme une ressource, vous ne le faites pas.

  3. {Binding Converter={StaticResource myFormatter} est beaucoup plus courte et plus facile à lire que la statique. À long terme, cela vous aidera à plus que vous pourriez penser.

Autres conseils

Tant que le formatter n'a vraiment pas d'état, cela devrait être bien. Il n'est pas équivalent bien. Dans le premier cas, vous avez une instance de la classe pour chaque instance de votre contrôle basé sur XAML. Dans le second, une seule instance sera jamais créé.

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