Я можу дати вам нормальне рішення, і ви можете з ним піти, але перш ніж це зробити, я спробую пояснити, чому 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;