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 サイトの他の関連記事を参照してください。