Связывание содержимого WPF RichTextBox - PullRequest
0 голосов
/ 05 ноября 2018

Я хочу привязать к RichTextBox, где я могу добавить прогоны текста с форматированием во время выполнения. Я использую шаблон MVVM, поэтому в идеале это можно сделать из ViewModel, а не из кода.

Вот что у меня есть:

<RichTextBox HorizontalAlignment="Stretch"
                VerticalAlignment="Stretch"
                Grid.Row="0"
                Grid.Column="0"
                BorderThickness="4"

                FontFamily="Consolas" 
                FontSize="{StaticResource TextBoxFontSize}"
                FontWeight="Bold"
                Background="Black"
                >

                <FlowDocument>
                <Paragraph>
                    <Run Foreground="{Binding TextColour}"
                        Text="{Binding CmdText}" />

                    <!-- I want to add more text runs here! -->

                    </Paragraph>
                </FlowDocument>

            </RichTextBox>

Проблема в том, что я не знаю, к какому методу в RTB я должен привязываться, чтобы добавить прогоны текста / абзацев в RTB во время выполнения. Если я знаю, я должен быть в состоянии создать метод, чтобы сделать это в модели представления достаточно легко.

Любая помощь приветствуется!

Спасибо!

1 Ответ

0 голосов
/ 06 ноября 2018

Если вы посмотрите в поле расширенного текста, то оно содержит FlowDocument, который снова содержит блоки.

    <RichTextBox>
        <FlowDocument>
            <Paragraph>
                <Run>Text here!</Run>
            </Paragraph>
        </FlowDocument>
    </RichTextBox>

Чтобы связать RichTextBox с контентом, можно создать (извлечь) элемент управления, который представляет FlowDocument из RichTextBox в качестве свойства зависимостей. В таком случае Viemodel поддерживает FlowDocument, и он обновляется в виде - вы привязываете его к реквизиту зависимости на своем производном элементе управления.

Теперь ввод текста будет проблемой, поскольку изменение содержимого в FlowDocument не уведомляет модель представления об изменениях. Блоки в FlowDocument должны находиться в ObservableCollection для того, чтобы их можно было наблюдать.

Короче говоря, RichTextBox не очень хорош в MVVM. Если возможность редактирования не требуется, вы можете представить свои данные из viewmodel в виде ObservableCollection, содержащего объекты INotifyPropertyChanged, и представить структуру с использованием ItemsControl и DataTemplates.

Я хотел бы добавить, что выполнение чего-либо в программном обеспечении не против MVVM, если вы поддерживаете разделение модели, представления и модели представления.

...