ホームページ > バックエンド開発 > C++ > 添付プロパティを使用して WPF RichTextBox データ バインディングを簡素化するにはどうすればよいですか?

添付プロパティを使用して WPF RichTextBox データ バインディングを簡素化するにはどうすればよいですか?

Patricia Arquette
リリース: 2025-01-08 08:33:43
オリジナル
464 人が閲覧しました

How Can Attached Properties Simplify WPF RichTextBox Data Binding?

添付プロパティを使用した WPF RichTextBox データ バインディングの簡素化

WPF RichTextBox のデータ バインディングは、開発者にとって常に課題でした。一般的な 2 つのアプローチには、RichTextBox をサブクラス化し、DependencyProperty を追加する方法と、「プロキシ」を使用する方法があります。ただし、どちらの方法にも欠点があります。

より簡単な解決策: 追加の DocumentXaml プロパティ

これらの制限を克服する簡単な方法は、追加の DocumentXaml プロパティを作成することです。このプロパティを使用すると、RichTextBox をドキュメントに直接バインドできます。

使用法:

<code class="language-xml"><TextBox Text="{Binding FirstName}"></TextBox>
<TextBox Text="{Binding LastName}"></TextBox>
<RichTextBox local:RichTextBoxHelper.DocumentXaml="{Binding Autobiography}"></RichTextBox></code>
ログイン後にコピー

実装の詳細:

実装プロセスには、DocumentXaml プロパティが変更されたときに RichTextBox のドキュメントを更新することが含まれます。コードは次のとおりです:

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

代替形式:

同じメソッドを TextFormats.RTF または TextFormats.XamlPackage で使用できます。 XamlPackage の場合、DocumentXaml プロパティの型は文字列ではなく byte[] になります。

XamlPackage 形式の利点:

XamlPackage には、純粋な XAML と比較して画像が埋め込まれ、使いやすいという利点があります。

結論:

この追加の DocumentXaml プロパティは、他のメソッドの制限を克服して、RichTextBox でのデータ バインディングに対するシンプルかつ効果的なソリューションを提供します。ドキュメントへの直接バインドが可能になり、テキストの書式設定機能がサポートされます。

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

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