Я могу дать вам правильное решение, и вы можете пойти с ним, но прежде чем я сделаю это, я попытаюсь объяснить, почему Document для не является DependencyProperty для начала.
Во время жизни элемента управления RichTextBox свойство Document обычно не изменяется. RichTextBox инициализируется с FlowDocument. Этот документ отображается, может быть отредактирован и искажен разными способами, но базовое значение свойства Document остается тем единственным экземпляром FlowDocument. Следовательно, на самом деле нет причин, по которым это должно быть свойство зависимости, то есть Bindable. Если у вас есть несколько мест, которые ссылаются
этот FlowDocument, вам нужна ссылка только один раз. Поскольку это везде один и тот же экземпляр, изменения будут доступны каждому.
Я не думаю, что FlowDocument поддерживает уведомления об изменении документа, хотя я не уверен.
Как говорится, вот решение. Прежде чем начать, поскольку RichTextBox не реализует INotifyPropertyChanged и Document не является свойством зависимости, у нас нет уведомлений, когда свойство RichTextBox Document изменяется, поэтому привязка может быть только OneWay.
Создайте класс, который будет предоставлять FlowDocument. Привязка требует наличия свойства зависимости, поэтому этот класс наследует от 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); }
}
}
Создайте окно с расширенным текстовым полем в 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>
Дайте Окну поле типа HasDocument.
HasDocument hasDocument;
Конструктор окна должен создать привязку.
hasDocument = new HasDocument();
InitializeComponent();
Binding b = new Binding("Document");
b.Source = richTextBox;
b.Mode = BindingMode.OneWay;
BindingOperations.SetBinding(hasDocument, HasDocument.DocumentProperty, b);
Если вы хотите иметь возможность объявлять привязку в XAML, вы должны сделать свой класс HasDocument производным от FrameworkElement, чтобы его можно было вставить в логическое дерево.
Теперь, если вы измените свойство документа в HasDocument, документ в поле форматированного текста также изменится.
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;