Как связать строку (в формате xaml) со свойством xaml RichTextBox в silverlight? - PullRequest
0 голосов
/ 25 июня 2011

У меня есть следующий 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 ]

5 голосов
/ 24 августа 2011

Вы можете создать собственное присоединенное свойство, если хотите использовать привязку данных.

В приведенном ниже примере кода добавляется присоединенное свойство к RichTextBox с именем XamlSource, которое можно использовать для привязки.

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>
0 голосов
/ 25 июня 2011

Xaml не является свойством зависимости в Silverlight, поэтому его нельзя привязать.Вам придется написать код, который подписывается на INotifyPropertyChanged и делает richTextBox.Xaml = obj.PostContent всякий раз, когда он меняется.

...