Maison > développement back-end > C++ > Comment les propriétés attachées peuvent-elles simplifier la liaison de données WPF RichTextBox ?

Comment les propriétés attachées peuvent-elles simplifier la liaison de données WPF RichTextBox ?

Patricia Arquette
Libérer: 2025-01-08 08:33:43
original
426 Les gens l'ont consulté

How Can Attached Properties Simplify WPF RichTextBox Data Binding?

Simplifiez la liaison de données WPF RichTextBox avec les propriétés attachées

La liaison de données de WPF RichTextBox a toujours été un défi pour les développeurs. Deux approches courantes incluent le sous-classement de RichTextBox et l'ajout d'un DependencyProperty, ou l'utilisation d'un « proxy ». Toutefois, les deux méthodes présentent des inconvénients.

Solution plus simple : propriétés DocumentXaml supplémentaires

Pour surmonter ces limitations, un moyen plus simple consiste à créer une propriété DocumentXaml supplémentaire. Cette propriété vous permet de lier le RichTextBox directement au document.

Utilisation :

<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

Détails de mise en œuvre :

Le processus d'implémentation implique la mise à jour du document de RichTextBox lorsque la propriété DocumentXaml change. Le code est le suivant :

<code class="language-csharp">public class RichTextBoxHelper : DependencyObject
{
    public static string GetDocumentXaml(DependencyObject obj)
    {
        return (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解析为文档并将其设置为RichTextBox
                    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

Format alternatif :

La même méthode peut être utilisée avec TextFormats.RTF ou TextFormats.XamlPackage. Pour XamlPackage, le type de propriété DocumentXaml sera byte[] au lieu de string.

Avantages du format XamlPackage :

XamlPackage présente les avantages des images intégrées et de la facilité d'utilisation par rapport au XAML pur.

Conclusion :

Cette propriété DocumentXaml supplémentaire fournit une solution simple et efficace pour la liaison de données dans RichTextBox, surmontant les limitations des autres méthodes. Il permet une liaison directe aux documents et prend en charge les capacités de formatage de texte.

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