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
Patricia Arquetteoriginal
2025-01-08 08:33:43429parcourir

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>

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>

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!

Déclaration:
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