Wpf 绑定ObservableCollection的正确方法是什么<;块>;存储在FlowDocument';第二段?

Wpf 绑定ObservableCollection的正确方法是什么<;块>;存储在FlowDocument';第二段?,wpf,richtextbox,Wpf,Richtextbox,我试图将ObservableCollection绑定到存储在FlowDocument段落中的ItemsControl,但这些块没有按预期设计内容 我有一个包装控件的自定义控件,如下所示: public class HelpCtrl : Control { static HelpCtrl() { DefaultStyleKeyProperty.OverrideMetadata(typeof(HelpCtrl), new FrameworkPropertyMetada

我试图将ObservableCollection绑定到存储在FlowDocument段落中的ItemsControl,但这些块没有按预期设计内容

我有一个包装控件的自定义控件,如下所示:

public class HelpCtrl : Control
{
    static HelpCtrl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(HelpCtrl), new FrameworkPropertyMetadata(typeof(HelpCtrl)));
    }

    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }

    public static readonly DependencyProperty TextProperty =
        DependencyProperty.Register("Text", typeof(string), typeof(HelpCtrl), new UIPropertyMetadata(null, OnTextChanged));

    static void OnTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        MemoryStream stream = new MemoryStream(File.ReadAllBytes(e.NewValue.ToString()));
        RichTextBox r = new RichTextBox();
        r.Selection.Load(stream, DataFormats.Rtf);
        HelpCtrl helpCtrl = d as HelpCtrl;

        ObservableCollection<Block> l = new ObservableCollection<Block>();
        while (r.Document.Blocks.Count > 0)
        {
            var block = r.Document.Blocks.FirstBlock;
            r.Document.Blocks.Remove(block);
            l.Add(block);
        }
        helpCtrl.Blocks = l;
    }



    public ObservableCollection<Block> Blocks
    {
        get { return (ObservableCollection<Block>)GetValue(BlocksProperty); }
        set { SetValue(BlocksProperty, value); }
    }

    public static readonly DependencyProperty BlocksProperty =
        DependencyProperty.Register("Blocks", typeof(ObservableCollection<Block>), typeof(HelpCtrl), new UIPropertyMetadata(null));


}

<Style TargetType="{x:Type local:HelpCtrl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:HelpCtrl}">
                <Grid>
                    <Grid x:Name="gridRichTextBox" Background="Black" Width="350" Height="600">
                        <RichTextBox   
                            IsReadOnly="True"
                            x:Name="rtbHelpText"            
                            VerticalScrollBarVisibility="Auto" 
                            HorizontalScrollBarVisibility="Auto"
                            >
                            <FlowDocument>
                                <Paragraph>
                                    <ItemsControl ItemsSource="{Binding Blocks, Mode=TwoWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:HelpCtrl}}}"/>

                                </Paragraph>
                            </FlowDocument>
                        </RichTextBox>
                    </Grid>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
公共类帮助Ctrl:Control
{
静态HelpCtrl()
{
OverrideMetadata(typeof(HelpCtrl),new FrameworkPropertyMetadata(typeof(HelpCtrl));
}
公共字符串文本
{
获取{return(string)GetValue(TextProperty);}
set{SetValue(TextProperty,value);}
}
公共静态只读DependencyProperty TextProperty=
Register(“Text”、typeof(string)、typeof(HelpCtrl)、新的UIPropertyMetadata(null、OnTextChanged));
静态void OnTextChanged(DependencyObject d、DependencyPropertyChangedEventArgs e)
{
MemoryStream stream=新的MemoryStream(File.ReadAllBytes(e.NewValue.ToString());
RichTextBox r=新的RichTextBox();
r、 加载(流、数据格式.Rtf);
HelpCtrl-HelpCtrl=d作为HelpCtrl;
ObservableCollection l=新的ObservableCollection();
而(r.Document.Blocks.Count>0)
{
var block=r.Document.Blocks.FirstBlock;
r、 文件。块。删除(块);
l、 添加(块);
}
helpCtrl.Blocks=l;
}
公众可观察的收集大厦
{
get{return(ObservableCollection)GetValue(BlocksProperty);}
set{SetValue(BlocksProperty,value);}
}
公共静态只读从属属性块属性=
DependencyProperty.Register(“块”、typeof(ObservableCollection)、typeof(HelpCtrl)、new UIPropertyMetadata(null));
}
我从rtf文件加载内容并进行设计,但我发现绑定不好,结果是:

“系统.窗口.文档.段落”


如何修复?

问题是ItemsControl没有任何模板来呈现段落块。所以在我回答你的问题之前,告诉我是否可以使用DocumentViewer而不是RichTextBox?或者您希望它可以编辑。谢谢,我发现我缺少添加数据模板。。。谢谢,问题解决了!伟大的发现@David,我应该把它作为一个答案发布吗?