Richtextbox wpf liaison
Pour faire la liaison de données du Document dans un WPF RichtextBox, j'ai vu 2 Solutions jusqu'à présent, qui sont à tirer de la RichtextBox et ajouter une DependencyProperty, et aussi la solution avec un "proxy".
Ni le premier ou le deuxième sont satisfaisants. Est-ce que qqn a une autre solution, ou plutôt, un commercial de contrôle au format RTF qui est capable de DataBinding? La zone de texte normale ist pas une alternative, puisque nous avons besoin de formatage de texte.
Une idée?
Vous devez vous connecter pour publier un commentaire.
Je sais que c'est un vieux post, mais de vérifier la Étendue WPF Toolkit. Il a un RichTextBox qui prend en charge ce que vous tryign à faire.
Il y a un moyen beaucoup plus facile!
Vous pouvez facilement créer une joint
DocumentXaml
(ouDocumentRTF
) les biens qui vous permettra de lier le RichTextBox du document. Il est utilisé comme cela, où l'Autobiographie est une chaîne de propriété dans votre modèle de données:Le tour est joué! Entièrement bindable RichTextBox données!
La mise en œuvre de cette propriété est très simple: Lorsque la propriété est définie, charger le XAML (ou RTF) dans une nouvelle FlowDocument. Lorsque le FlowDocument modifications, mise à jour de la valeur de la propriété.
Ce code devrait faire l'affaire:
Le même code peut être utilisé pour TextFormats.RTF ou TextFormats.XamlPackage. Pour XamlPackage vous avez une propriété de type byte[] au lieu de string.
La XamlPackage format a plusieurs avantages sur la plaine XAML, en particulier la possibilité d'inclure des ressources telles que des images, et il est plus souple et plus facile à travailler que le format RTF.
Il est difficile de croire que cette question a siégé pendant 15 mois sans que personne n'en soulignant le moyen facile de le faire.
range.Changed
événement n'est jamais appelé.Je peux vous donner un ok de la solution, et vous pouvez aller avec elle, mais avant que je le fais, je vais essayer d'expliquer pourquoi le Document est pas une DependencyProperty pour commencer.
Au cours de la durée de vie d'un contrôle RichTextBox, le Document de propriété en général ne change pas. Le RichTextBox est initialisé avec un FlowDocument. Ce document est affiché, vous pouvez modifier et de déformation dans beaucoup de façons, mais la valeur sous-jacente de la propriété de Document reste qu'une instance de l'FlowDocument. Par conséquent, il n'y a vraiment aucune raison pour que cela devrait être une Propriété de Dépendance, c'est à dire, pouvant être liés. Si vous avez plusieurs sites de référence
cette FlowDocument, vous avez seulement besoin de la référence une fois. Puisque c'est le même instance de partout, les modifications seront accessibles à tout le monde.
Je ne pense pas que FlowDocument document prend en charge les notifications de changement, même si je ne suis pas sûr.
Cela étant dit, voici une solution. Avant de commencer, depuis RichTextBox ne pas implémenter INotifyPropertyChanged et le Document n'est pas une propriété de dépendance, nous n'avons pas de notifications quand le RichTextBox du Document modifications de la propriété, de sorte que la liaison ne peut être Unidirectionnelle.
Créer une classe qui va fournir la FlowDocument. Liaison nécessite l'existence d'une Dépendance de la Propriété, de sorte que cette classe hérite de DependencyObject.
Créer une Fenêtre avec une zone de texte enrichi dans le code XAML.
Donner la Fenêtre, un champ de type HasDocument.
Constructeur de fenêtre doit créer la liaison.
Si vous voulez être en mesure de déclarer que la liaison en XAML, vous devez faire votre HasDocument classe de dérivés de FrameworkElement de sorte qu'il peut être inséré dans l'arborescence logique.
Maintenant, si vous modifiez la propriété de Document sur HasDocument, la riche zone de texte du Document va aussi changer.
J'ai réglé code précédent un peu.
Tout d'abord la gamme.Changé n'a pas de travail pour moi.
Après j'ai changé de gamme.Changé à richTextBox.TextChanged il s'avère que l'événement TextChanged gestionnaire peut invoquer SetDocumentXaml de manière récursive, donc j'ai fourni une protection contre elle. J'ai aussi utilisé XamlReader/XamlWriter au lieu de TextRange.
Cela semble être la façon la plus simple de loin et n'est pas affichée dans l'une de ces réponses.
Dans le modèle de vue juste le
Text
variable.Pourquoi ne pas simplement utiliser un FlowDocumentScrollViewer ?
Créer un UserControl qui a un RichTextBox.. Maintenant, ajoutez les éléments suivants de la propriété de dépendance:
Cette solution est probablement que "proxy" de la solution que vous avez vu quelque part.. Cependant.. RichTextBox simplement ne pas avoir le Document en tant que DependencyProperty... de Sorte que vous avez à faire cela d'une autre façon...
HTH
Voici un VB.Net la version de Lolo réponse:
Fin De La Classe
Ce VB.Net version fonctionne pour ma situation. J'ai supprimé le fil de la collection de sémaphore, au lieu d'utiliser RemoveHandler et AddHandler. Aussi, depuis un FlowDocument ne peut être lié à un RichTextBox à un moment, je l'ai mis dans une case que le RichTextBox est IsLoaded=True. Commençons par la façon dont j'ai utilisé la classe dans un MVVM application qui utilise ResourceDictionary au lieu de la Fenêtre.
La plupart de mes besoins ont été satisfaits de cette réponse https://stackoverflow.com/a/2989277/3001007 par krzysztof. Mais un problème avec ce code (j'ai fait face a), la liaison ne fonctionne pas avec de multiples contrôles. J'ai donc changé
_recursionProtection
avec unGuid
en fonction de la mise en œuvre. Donc, il travaille pour Plusieurs contrôles dans la même fenêtre.Par souci d'exhaustivité, permettez-moi d'ajouter quelques lignes de réponse originale à cette question https://stackoverflow.com/a/2641774/3001007 par ray-brûlures. C'est la façon d'utiliser le helper.
Les gars, pourquoi vous embêter avec tous les faff. Cela fonctionne parfaitement. Aucun code n'est requis
Text
propriété deRun
n'est pas la propriété de dépendance, donc ce n'est même pas compiler. Seulement les propriétés de dépendance en charge la liaison de ce genre.