Вы можете создать собственное присоединенное свойство, если хотите использовать привязку данных.
В приведенном ниже примере кода добавляется присоединенное свойство к 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>