Ich kann Ihnen eine ok - Lösung geben und man kann mit ihm gehen, aber bevor ich das tue , ich werde zu erklären versuchen , warum Dokument ist nicht ein DependencyProperty
zu beginnen.
Während der Lebensdauer eines RichTextBox
Steuerelements Document
ändert sich die Eigenschaft im Allgemeinen nicht. Das RichTextBox
wird mit a initialisiert FlowDocument
. Dieses Dokument wird angezeigt, kann auf viele Arten bearbeitet und entstellt werden, aber der zugrunde liegende Wert der Document
Eigenschaft bleibt die eine Instanz von FlowDocument
. Daher gibt es wirklich keinen Grund, warum es ein DependencyProperty
, dh bindbar sein sollte. Wenn Sie mehrere Standorte haben, die darauf verweisen FlowDocument
, benötigen Sie den Verweis nur einmal. Da es sich überall um dieselbe Instanz handelt, sind die Änderungen für alle zugänglich.
Ich glaube nicht, dass FlowDocument
Benachrichtigungen über Dokumentänderungen unterstützt werden, obwohl ich nicht sicher bin.
Davon abgesehen ist hier eine Lösung. Bevor Sie beginnen, haben wir keine Benachrichtigungen, wenn sich die Document-Eigenschaft der Dokumentation ändert , da RichTextBox
sie nicht implementiert ist INotifyPropertyChanged
und Document keine ist . Daher kann die Bindung nur OneWay sein.DependencyProperty
RichTextBox
Erstellen Sie eine Klasse, die die bereitstellt FlowDocument
. Die Bindung erfordert die Existenz von a DependencyProperty
, daher erbt diese Klasse von DependencyObject
.
class HasDocument : DependencyObject
{
public static readonly DependencyProperty DocumentProperty =
DependencyProperty.Register("Document",
typeof(FlowDocument),
typeof(HasDocument),
new PropertyMetadata(new PropertyChangedCallback(DocumentChanged)));
private static void DocumentChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
Debug.WriteLine("Document has changed");
}
public FlowDocument Document
{
get { return GetValue(DocumentProperty) as FlowDocument; }
set { SetValue(DocumentProperty, value); }
}
}
Erstellen Sie ein Window
mit einem Rich-Text-Feld in XAML.
<Window x:Class="samples.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Flow Document Binding" Height="300" Width="300"
>
<Grid>
<RichTextBox Name="richTextBox" />
</Grid>
</Window>
Geben Sie Window
ein Feld vom Typ an HasDocument
.
HasDocument hasDocument;
Der Fensterkonstruktor sollte die Bindung erstellen.
hasDocument = new HasDocument();
InitializeComponent();
Binding b = new Binding("Document");
b.Source = richTextBox;
b.Mode = BindingMode.OneWay;
BindingOperations.SetBinding(hasDocument, HasDocument.DocumentProperty, b);
Wenn Sie die Bindung in XAML deklarieren möchten, müssen Sie Ihre HasDocument
Klasse von ableiten lassen, FrameworkElement
damit sie in den logischen Baum eingefügt werden kann.
Wenn Sie nun die Document
Eigenschaft ändern, ändern sich auch die HasDocument
Rich-Text-Felder Document
.
FlowDocument d = new FlowDocument();
Paragraph g = new Paragraph();
Run a = new Run();
a.Text = "I showed this using a binding";
g.Inlines.Add(a);
d.Blocks.Add(g);
hasDocument.Document = d;