Я можу дати вам нормальне рішення, і ви можете з ним піти, але перш ніж це зробити, я спробую пояснити, чому Document не єDependencyProperty для початку.
Протягом життя елемента RichTextBoxуправління Documentвластивість, як правило, не змінюється. RichTextBoxІніціалізується з FlowDocument. Цей документ відображається, його можна редагувати та спотворювати різними способами, але основна вартість Documentвластивості залишається одним екземпляром FlowDocument. Тому насправді немає жодної причини, щоб він мав бути DependencyProperty, тобто, прив'язуваним. Якщо у вас є кілька місцеположень, які посилаються на це FlowDocument, вам потрібно лише один раз. Оскільки скрізь однаковий екземпляр, зміни будуть доступні кожному.
Я не думаю, що FlowDocumentпідтримує сповіщення про зміну документа, хоча я не впевнений.
З огляду на це, ось рішення. Перш ніж почати, оскільки RichTextBoxне реалізується INotifyPropertyChangedі Document не є DependencyProperty, ми не отримуємо повідомлень про те, щоRichTextBox зміну властивості Document, тому прив'язка може бути лише OneWay.
Створіть клас, який забезпечить FlowDocument. Прив'язка вимагає існування a DependencyProperty, тому цей клас успадковує від 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); }
}
}
Створіть Windowполе з розширеним текстом у 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>
Дайте 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того, щоб його можна було вставити в логічне дерево.
Тепер, якщо ви хотіли змінити Documentвластивість HasDocument, зміниться і текстове поле розширеного тексту 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;