【问题标题】:WPF RichTextBox Content BindingWPF RichTextBox 内容绑定
【发布时间】:2018-11-05 18:00:59
【问题描述】:

我想绑定到 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。如果我知道我应该能够轻松地在视图模型中创建方法来执行此操作。

感谢任何帮助!

谢谢!

【问题讨论】:

标签: wpf binding richtextbox


【解决方案1】:

如果您查看富文本框,则它包含 FlowDocument,而后者又包含 Blocks。

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

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

现在,文本输入将成为问题,因为更改 FlowDocument 中的内容不会通知视图模型有关更改。 FlowDocument 中的 Blocks 应该驻留在 ObservableCollection 中,以便可以观察到。

简而言之,RichTextBox 在 MVVM 方面不是很擅长。如果不需要可编辑性,您可以将 viewmodel 中的数据显示为包含 INotifyPropertyChanged 对象的 ObservableCollection,并使用 ItemsControl 和 DataTemplates 显示结构。

我想补充一点,只要您保持模型、视图和视图模型的分离,在代码隐藏中执行某些操作并不违反 MVVM。

【讨论】:

    猜你喜欢
    • 2010-09-25
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-04
    • 2011-06-05
    • 1970-01-01
    相关资源
    最近更新 更多