2010-10-29 26 views
1

Le projet sur lequel je travaille actuellement est une application de type éditeur de texte. Je me demande comment je peux gérer les options de vue personnalisées. par exemple. famille de police, taille, gras, couleurs pour mon TextBox. Mon onglet de l'éditeur est un EditorTabViewModel dans la vue est un contrôle utilisateur personnalisé MarkdownEditor. C'est fondamentalement une zone de texte avec quelques boutons pour gras/italique etc. Je me demande comment puis-je en quelque sorte définir les options pour le custom/usercontrol de OptionsView de mon application?WPF/C#/MVVM: besoin d'aide pour implémenter des options d'affichage personnalisées pour le contrôle utilisateur

la façon dont je suis rendu le rédacteur en chef est

<Window.Resources> 
    <DataTemplate DataType="{x:Type vm:EditorTabViewModel}"> 
     <me:MarkdownEditor /> 
    </DataTemplate> 
</Window.Resources> 

MarkdownEditor est un contrôle utilisateur qui expose les propriétés d'affichage publics pour définir les polices, les couleurs, etc.

MISE À JOUR: aussi car il peut y avoir beaucoup MarkdownEditor s dans l'application, je veux que les options soient globales

Répondre

2

Rien ne vous empêche d'avoir View constructions dans votre ViewModel ... surtout si y Vous considérez que ViewModel est un modèle de la vue (par opposition à une vue du modèle). Pas tous les puristes pensent que c'est une bonne idée. La plupart des pragmatistes, cependant, le font. Avoir des propriétés comme FontWeight, FontColor, FontSize, etc dans votre EditorTabViewModel fonctionnerait pour vous ici, et vous pouvez ensuite les lier dans les propriétés de MarkdownEditor. Cela vous permettrait de modifier dynamiquement les propriétés de l'interface utilisateur du texte via ViewModel. Si vous êtes un puriste et que vous n'aimez pas que ViewModel soit au courant des constructions View spécifiques à WPF, vous pouvez créer votre propre classe de formatage de texte, appelée TextFormatting. TextFormatting peut inclure votre propre représentation de l'information que vous voulez communiquer (gras, italique, couleur, taille de police, etc.). Vous pouvez ensuite lier cet objet TextFormatting au MarkdownEditor en utilisant une propriété jointe/comportement. La propriété jointe/comportement serait responsable de mapper la représentation de mise en forme à la représentation WPF. Le faire de la deuxième façon est très utile si vous avez différentes vues (WinForms/WPF) qui pourraient utiliser le même ViewModel, puisqu'il reste agnostique pour le moteur de vue. Il ajoute également une couche de complexité que la première option n'a pas.

+0

+1 FWIW, je suis un puriste et suggérerais la deuxième approche avec quelques 'IValueConverters' :) –

+0

@Steve Greatrex: Oui, c'est une bonne idée ... vous pouvez toujours lier Voir les propriétés à votre coutume enums utilisant un IValueConverter pour mapper l'énumération à la construction View appropriée. S'il y a beaucoup de propriétés à lier, alors il faudra beaucoup de convertisseurs de valeurs pour faire le mapping. C'est là qu'une propriété attachée statique peut mapper un objet 'TextFormatting' à un' UIElement'. De là, vous pouvez créer un seul 'IValueConverter' pour faire le travail. Cela élimine le comportement lié (mais pas la propriété jointe) que j'ai mentionné. –

+0

@Steve Greatrex, mais qu'est-ce que 'IValueConverters' pour dans ce cas? –