簡素化された WPF RichTextBox データ バインディング
WPF RichTextBox
のデータ バインディングは難しい場合があります。ただし、もっと簡単な代替方法があります。
追加の DocumentXaml プロパティ
RichTextBox
から継承する代わりに、DocumentXaml
のドキュメント コンテンツに直接バインドできる追加の RichTextBox
属性を作成できます。実装は次のとおりです:
<code class="language-csharp">public static class RichTextBoxHelper { 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; var doc = new FlowDocument(); var xaml = GetDocumentXaml(richTextBox); var range = new TextRange(doc.ContentStart, doc.ContentEnd); range.Load(new MemoryStream(Encoding.UTF8.GetBytes(xaml)), DataFormats.Xaml); richTextBox.Document = doc; range.Changed += (obj2, e2) => { if (richTextBox.Document == doc) { using var buffer = new MemoryStream(); range.Save(buffer, DataFormats.Xaml); SetDocumentXaml(richTextBox, Encoding.UTF8.GetString(buffer.ToArray())); } }; } }); }</code>
使用法:
<code class="language-xml"><TextBox Text="{Binding FirstName}"></TextBox> <TextBox Text="{Binding LastName}"></TextBox> <RichTextBox local:RichTextBoxHelper.DocumentXaml="{Binding Autobiography}"></RichTextBox></code>
この追加属性により、RichTextBox
のドキュメントをデータ モデル プロパティに簡単にバインドできます。このコードは、XAML コンテンツを FlowDocument
に解析し、ドキュメントが変更されたときにバインディングを更新します。
XamlPackage 形式の利点:
XAML パッケージ形式には、画像の組み込みや柔軟性の向上など、プレーン XAML に比べて利点があります。データ バインディングのニーズに応じて XamlPackage の使用を検討してください。
結論:
添付された DocumentXaml
属性を使用すると、WPF で RichTextBox
のデータ バインディングを簡単に行うことができます。このソリューションを使用すると、RichTextBox
コントロールのデータ バインディングのニーズが簡素化されます。
以上がWPF RichTextBox でのデータ バインディングを簡素化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。