К сожалению, нет простого способа сделать это ... Насколько я знаю, лучшее, что вы можете сделать, это вернуть строку XAML и использовать конвертер для ее анализа.
Предупреждение: уродливокод впереди ...
XAML
<Window.Resources>
<local:XamlToTextBlockConverter x:Key="xamlConverter" />
</Window.Resources>
<Grid>
<ContentControl Content="{Binding MyTextWithHyperlink, Converter={StaticResource xamlConverter}}" />
</Grid>
Преобразователь
public class XamlToTextBlockConverter : IValueConverter
{
#region Implementation of IValueConverter
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string xaml = value as string;
if (xaml == null)
return Binding.DoNothing;
const string textBlockFormat =
@"<TextBlock xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"">{0}</TextBlock>";
string fullXaml = string.Format(textBlockFormat, xaml);
return (TextBlock)XamlReader.Parse(fullXaml);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
}
ViewModel
public string MyTextWithHyperlink
{
get { return "Click <Hyperlink Command=\"{Binding MyCommand}\">here</Hyperlink> to continue"; }
}
Обратите внимание на использование ContentControl
вместо TextBlock
: это потому, что свойство TextBlock.Text
может содержать только простой текст, а не форматированный документ и Inlines
свойство не может быть связано, потому что это не свойство зависимости (и в любом случае оно доступно только для чтения).Вместо этого мы вручную создаем TextBlock
в конвертере и присваиваем его содержимому ContentControl
.
Это определенно не очень элегантное решение, но оно работает ...