如何将字符串(以xaml格式)绑定到silverlight中的RichTextBox的xaml属性?

时间:2011-06-25 04:19:01

标签: silverlight xaml binding properties richtextbox

我有以下xaml,

<RichTextBox Name="RichTextBoxPostContent" Margin="0" Padding="8,8,8,0" IsReadOnly="True" Foreground="{x:Null}" Xaml="{Binding Path=PostContent}"/>

和PostContent(一个字符串)将xaml存储为字符串,我不知道如何将其绑定到RichTextBox的Xaml属性,以下是PostContent的值,

<Section xml:space="preserve" HasTrailingParagraphBreakOnPaste="False" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"><Paragraph FontSize="11" FontFamily="Portable User Interface" Foreground="#FF000000" FontWeight="Normal" FontStyle="Normal" FontStretch="Normal" TextAlignment="Left"><Run Text="aaa" /></Paragraph></Section>

2 个答案:

答案 0 :(得分:5)

如果要使用数据绑定,可以创建自己的附加属性。

下面的代码示例将附加属性添加到名为XamlSource的RichTextBox,您可以使用它来绑定。

public static class RichTextBoxBinder
{
  #region RichTextBox attached properties

  public static readonly DependencyProperty XamlSourceProperty =
    DependencyProperty.RegisterAttached(
      "XamlSource",
      typeof(string),
      typeof(RichTextBox),
      new PropertyMetadata(OnXamlSourcePropertyChanged));

  private static void OnXamlSourcePropertyChanged(
    DependencyObject d,
    DependencyPropertyChangedEventArgs e)
  {
    var rtb = d as RichTextBox;
    if (rtb == null) throw new ArgumentException(
      "Expected a dependency object of type RichTextBox.", "d");

    string xaml = null;
    if (e.NewValue != null)
    {
      xaml = e.NewValue as string;
      if (xaml == null) throw new ArgumentException("Expected a value of type string.", "e.NewValue");
    }

    // Set the xaml and reset selection
    rtb.Xaml = xaml ?? string.Empty;
    rtb.Selection.Select(rtb.ContentStart, rtb.ContentStart);
  }

  #endregion

  public static void SetXamlSource(this RichTextBox rtb, string xaml)
  {
    rtb.SetValue(XamlSourceProperty, xaml);
  }

  public static string GetXamlSource(this RichTextBox rtb)
  {
    return (string) rtb.GetValue(XamlSourceProperty);
  }
}

如果要绑定的属性如下所示:

public string MyRichTextXamlProperty
{
  get
  {
    return
      string.Concat(
        @"<Section xml:space=""preserve"" HasTrailingParagraphBreakOnPaste=""False""",
        @" xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"">",
        @"<Paragraph FontSize=""11"" FontFamily=""Portable User Interface""",
        @" Foreground=""#FF000000"" FontWeight=""Normal"" FontStyle=""Normal""",
        @" FontStretch=""Normal"" TextAlignment=""Left""><Run Text=""aaa"" />",
        @"</Paragraph></Section>"
        );
    // Hints: (Thanks Christoph)
    // 1) Pay special attention that you include the appropriate XML namespaces
    //    e.g. 2nd parameter in string.Concat above.
    // 2) When you have to use resources, they have to be DynamicResource and 
    //    not StaticResource. This is because your resources are only available
    //    at runtime.
  }
}

然后你的xaml看起来与此相似:

<UserControl
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="clr-namespace:MyNamespace"
  x:Class="MyClass" >
  <Grid>
    <RichTextBox local:RichTextBoxBinder.XamlSource="{Binding MyRichTextXamlProperty}" />
  </Grid>
</UserControl>

答案 1 :(得分:0)

Xaml不是Silverlight中的依赖项属性,因此您无法绑定它。您必须编写订阅INotifyPropertyChanged的代码,并在其发生更改时执行richTextBox.Xaml = obj.PostContent