Heim > Backend-Entwicklung > C++ > Wie kann ich die Datenbindung für ein WPF RichTextBox-Dokument vereinfachen?

Wie kann ich die Datenbindung für ein WPF RichTextBox-Dokument vereinfachen?

Linda Hamilton
Freigeben: 2025-01-08 08:27:44
Original
887 Leute haben es durchsucht

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

Vereinfachte Lösung für die WPF RichTextBox-Dokumentdatenbindung

Beim Versuch, die Datenbindung für ein WPF RichTextBox-Dokument zu implementieren, gibt es zwei Hauptlösungen: Erstellen Sie eine benutzerdefinierte abgeleitete RichTextBox-Klasse mit abhängigen Eigenschaften oder verwenden Sie die „Proxy“-Methode. Allerdings gibt es bei diesen Methoden noch Verbesserungspotenzial.

Vereinfachte Lösung mit angehängten Attributen

Eine einfachere Alternative besteht darin, ein zusätzliches DocumentXaml-Attribut zu erstellen. Diese Eigenschaft ermöglicht eine einfache Bindung der RichTextBox an das Dokument. So verwenden Sie es:

<textbox text="{Binding FirstName}"></textbox><textbox text="{Binding LastName}"></textbox><richtextbox local:richtextboxhelper.documentxaml="{Binding Autobiography}"></richtextbox>
Nach dem Login kopieren

Leistung

DocumentXamlBei der Implementierung angehängter Eigenschaften geht es um das Laden von XAML (oder RTF) in ein neues FlowDocument beim Festlegen der Eigenschaft. Stattdessen werden die Eigenschaftswerte aktualisiert, wenn sich das FlowDocument ändert.

Der folgende Code kapselt die Implementierung:

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()));
                    }
                };
            }
        });
}
Nach dem Login kopieren

Diese Methode bietet eine praktische Option zum Binden von RichTextBox-Dokumenten, ohne dass komplexe Lösungen oder kommerzielle Kontrollen erforderlich sind.

Das obige ist der detaillierte Inhalt vonWie kann ich die Datenbindung für ein WPF RichTextBox-Dokument vereinfachen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage