ホームページ > バックエンド開発 > C++ > WPF RichTextBox ドキュメントのデータ バインディングを簡素化するにはどうすればよいですか?

WPF RichTextBox ドキュメントのデータ バインディングを簡素化するにはどうすればよいですか?

Linda Hamilton
リリース: 2025-01-08 08:27:44
オリジナル
856 人が閲覧しました

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

WPF RichTextBox ドキュメント データ バインディングの簡素化されたソリューション

WPF RichTextBox ドキュメントのデータ バインディングを実装しようとする場合、主な解決策は 2 つあります。依存プロパティを持つカスタム RichTextBox 派生クラスを作成するか、「プロキシ」メソッドを使用します。ただし、これらの方法にはまだ改善の余地があります。

添付属性を使用した簡略化されたソリューション

より簡単な代替方法は、追加の DocumentXaml 属性を作成することです。このプロパティを使用すると、RichTextBox をドキュメントに簡単にバインドできます。使い方は以下の通りです:

<textbox text="{Binding FirstName}"></textbox><textbox text="{Binding LastName}"></textbox><richtextbox local:richtextboxhelper.documentxaml="{Binding Autobiography}"></richtextbox>
ログイン後にコピー

実績

DocumentXaml添付プロパティの実装は、プロパティを設定するときに XAML (または RTF) を新しい FlowDocument にロードすることを中心に展開します。代わりに、FlowDocument が変更されると、プロパティ値が更新されます。

次のコードは実装をカプセル化します:

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()));
                    }
                };
            }
        });
}
ログイン後にコピー

このメソッドは、複雑なソリューションや商用コントロールを必要とせずに、RichTextBox ドキュメントをバインドするための便利なオプションを提供します。

以上がWPF RichTextBox ドキュメントのデータ バインディングを簡素化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート