绑定到RichTextBox Blocks属性

时间:2013-12-12 15:46:09

标签: c# .net xaml windows-phone-8

我想直接绑定到我的Xaml中RichTextBox的Blocks属性。这是不可能的,因为Blocks属性是只读的。我可以直接绑定到单个运行:

<RichTextBox x:Name="MyRichTextBox" FontSize="36" Margin="10" Foreground="White">
    <Paragraph>
        <Run Text="{Binding MyObject.Text}" Foreground="Yellow"/>
        <Run Text="{Binding MyObject.Text}" Foreground="Cyan"/>
    </Paragraph>
</RichTextBox>

我想做点什么:

<RichTextBox x:Name="MyRichTextBox" Blocks="{Binding MyObject.RichTextBlocks}" FontSize="36" Margin="10" Foreground="White"/>

特别是因为我事先并不知道从绑定对象返回多少个块。

实现此目的的正确方法是为具有RichTextBox属性的RichTextBlocks创建附加行为,该属性在设置时通过块枚举并调用{{1每一个?

我是C#,. NET和XAML的新手,请原谅基本问题,我们将非常感谢您提供简单解释的答案。

1 个答案:

答案 0 :(得分:2)

使用@Nogard和其他帖子的指针,我创建了一个名为RichText依赖属性的类。已发布在此处,以防其他人使用。

  public class MyRichTextBox : RichTextBox
    {
        public static readonly DependencyProperty RichTextProperty = DependencyProperty.Register("RichText", typeof(Paragraph), typeof(MyRichTextBox), new PropertyMetadata(null, RichTextPropertyChanged));

        public Paragraph RichText
        {
            get 
            { 
                return (Paragraph)GetValue(RichTextProperty); 
            }

            set 
            { 
                SetValue(RichTextProperty, value); 
            }
        }

        private static void RichTextPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
        {
            MyRichTextBox richTextBox = (MyRichTextBox)dependencyObject;
            Paragraph paragraph = (Paragraph)dependencyPropertyChangedEventArgs.NewValue;

            // Remove any existing content from the text box
            richTextBox.Blocks.Clear();

            // Add the paragraph to the text box
            richTextBox.Blocks.Add(paragraph);
        }
    }
}

并将此添加到我的xaml ...

<sub:MyRichTextBox x:Name="MyRichTextOverlay" RichText="{Binding CurrentOverlay.RichTextParagraph}"  VerticalAlignment="Top" FontSize="36" Margin="10" Foreground="White" HorizontalAlignment="Center" TextWrapping="Wrap" TextAlignment="Center"/>