我最近正在开展一个项目,我觉得一个很好的解决方案是在RichTextBox
中显示一个段落,该段落绑定到一个对象集合,这些对象将包含一个字符串和一些关于该字符串的属性。我希望我能做到这样的事情:
<RichTextBox Name="rtb" IsReadOnly="True" FontSize="14" FontFamily="Courier New">
<FlowDocument>
<Paragraph>
<Run Foreground="Red" Text="{Binding foo}"/>
<Run Foreground="Green" Text="{Binding bar}"/>
<Run Foreground="Blue" Text="{Binding baz}"/>
</Paragraph>
</FlowDocument>
</RichTextBox>
这很好用,但这是提前定义所有绑定,但实际上我不会知道它们直到运行时,每个字符串都会存储到一个集合中。我试图想出一种定义和绑定多个Run
块的方法,并将它们全部放在要显示的RichTextBox
中。如果可能的话,我更喜欢主要的xaml解决方案,但如果我必须在后面的代码中执行它可能没问题,只要绑定粘在一起并且在初始加载后一切都正确更新。
我尝试过这样的事情,但是无法确定如何从后面的代码中绑定到Text
的{{1}}属性:
Run
我还尝试将foreach (var item in col)
{
Run run = new Run();
Binding b = new Binding();
b.Source = this;
b.Path = new PropertyPath(item.StaticText);
run.SetBinding(run.Text, b); //Tells me Text is not a dependency property
//But it could be bound if this were xaml?
}
放在ItemsControl
的{{1}}作为项目的数据模板,但它不允许我将数据模板设为{{ 1}}标签,我不确定那会不会有用。
关于最佳方法的任何指导,或我的解决方案有什么问题。
答案 0 :(得分:1)
你可以用这个......
<Paragraph>
<ItemsControl ItemsSource="{Binding MyRuns}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock>
<Run Foreground="{Binding Color}" Text="{Binding Text}"/>
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate >
<StackPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
<!--<Run Foreground="Red" Text="{Binding foo}"/>
<Run Foreground="Green" Text="{Binding bar}"/>
<Run Foreground="Blue" Text="{Binding baz}"/>-->
</Paragraph>
将MyRuns
定义为视图模型的集合,例如
public ObservableCollection<RunData> MyRuns { get; set; }
将属性放入RunData
等
你当然可以删除ItemsControl.ItemsPanel
,这只是为了好玩
答案 1 :(得分:0)
这似乎已经完成了我的工作,我创建了ItemsControl
使用WrapPanel
作为ItemsPanel
。然后我可以将每个项目绑定到我的字符串集合,它看起来像一个很好的变量字符串段落。我会保持问题的开放,以防万一有人提出更优雅的解决方案。
<RichTextBox Name="rtb" IsReadOnly="True">
<FlowDocument>
<Paragraph>
<ItemsControl ItemsSource="{Binding col}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock>
<TextBlock Text="{Binding StaticText,
UpdateSourceTrigger=PropertyChanged}"/><TextBlock Text=" "/>
</TextBlock>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Paragraph>
</FlowDocument>
</RichTextBox>