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