WPF RichTextBox内容绑定

时间:2018-11-05 18:01:00

标签: wpf binding richtextbox

我想绑定到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 :(得分:0)

如果查看富文本框,则其中包含FlowDocument,而FlowDocument再次包含Blocks。

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

要将RichTextBox绑定到内容,可以创建(派生)一个控件,该控件将RichTextBox中的FlowDocument公开为依赖项属性。在这种情况下,Viemodel会维护FlowDocument并将其更新到视图中-您将其绑定到派生控件上的dpendency属性。

现在,文本输入将成为问题,因为在FlowDocument中更改内容不会将更改通知给ViewModel。 FlowDocument中的Blocks应该位于ObservableCollection中,以便可以观察。

简而言之,RichTextBox在MVVM方面不是很好。如果不需要可编辑性,则可以将来自ViewModel的数据呈现为包含INotifyPropertyChanged对象的ObservableCollection并使用ItemsControl和DataTemplates呈现结构。

我想补充一点,只要保持模型,视图和视图模型的分离,在代码隐藏中进行操作就不会违反MVVM。