Maison > développement back-end > C++ > Comment puis-je simplifier la liaison de données pour un document WPF RichTextBox ?

Comment puis-je simplifier la liaison de données pour un document WPF RichTextBox ?

Linda Hamilton
Libérer: 2025-01-08 08:27:44
original
814 Les gens l'ont consulté

How Can I Simplify Data Binding for a WPF RichTextBox Document?

Solution simplifiée de liaison de données de document WPF RichTextBox

Lorsque vous essayez d'implémenter la liaison de données pour un document WPF RichTextBox, il existe deux solutions principales : créer une classe dérivée RichTextBox personnalisée avec des propriétés dépendantes ou utiliser la méthode "proxy". Cependant, ces méthodes peuvent encore être améliorées.

Solution simplifiée utilisant les attributs attachés

Une alternative plus simple consiste à créer un attribut DocumentXaml supplémentaire. Cette propriété permet une liaison facile du RichTextBox au document. Comment l'utiliser est le suivant :

<code class="language-xml"><textbox text="{Binding FirstName}"></textbox><textbox text="{Binding LastName}"></textbox><richtextbox local:richtextboxhelper.documentxaml="{Binding Autobiography}"></richtextbox></code>
Copier après la connexion

Réussite

DocumentXamlL'implémentation des propriétés attachées s'articule autour du chargement de XAML (ou RTF) dans un nouveau FlowDocument lors de la définition de la propriété. Au lieu de cela, lorsque le FlowDocument change, les valeurs des propriétés sont mises à jour.

Le code suivant encapsule l'implémentation :

<code class="language-csharp">public class RichTextBoxHelper : DependencyObject
{
    public static string GetDocumentXaml(DependencyObject obj) => (string)obj.GetValue(DocumentXamlProperty);
    public static void SetDocumentXaml(DependencyObject obj, string value) => obj.SetValue(DocumentXamlProperty, value);

    public static readonly DependencyProperty DocumentXamlProperty =
        DependencyProperty.RegisterAttached("DocumentXaml", typeof(string), typeof(RichTextBoxHelper), new FrameworkPropertyMetadata
        {
            BindsTwoWayByDefault = true,
            PropertyChangedCallback = (obj, e) =>
            {
                var richTextBox = (RichTextBox)obj;

                // 将XAML解析为文档
                var doc = new FlowDocument();
                var range = new TextRange(doc.ContentStart, doc.ContentEnd);
                range.Load(new MemoryStream(Encoding.UTF8.GetBytes(GetDocumentXaml(richTextBox))), DataFormats.Xaml);

                // 设置文档
                richTextBox.Document = doc;

                // 文档更改时更新源
                range.Changed += (obj2, e2) =>
                {
                    if (richTextBox.Document == doc)
                    {
                        MemoryStream buffer = new MemoryStream();
                        range.Save(buffer, DataFormats.Xaml);
                        SetDocumentXaml(richTextBox, Encoding.UTF8.GetString(buffer.ToArray()));
                    }
                };
            }
        });
}</code>
Copier après la connexion

Cette méthode offre une option pratique pour lier des documents RichTextBox sans avoir besoin de solutions complexes ou de contrôles commerciaux.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal