您可以在 XAML 属性数据绑定期间对超链接的 NavigateUri 属性进行 StringFormat 吗?
Posted
技术标签:
【中文标题】您可以在 XAML 属性数据绑定期间对超链接的 NavigateUri 属性进行 StringFormat 吗?【英文标题】:Can you StringFormat the NavigateUri property for Hyperlinks during XAML property databinding? 【发布时间】:2011-04-04 11:52:36 【问题描述】:作为 WPF 数据绑定的一部分,有没有一种简单的方法来转换或格式化字符串?
假设我想创建一个基于字符串标签的 WPF 超链接元素。
<Hyperlink NavigateUri="Binding Tag">
<Run Text="Binding Tag" />
</Hyperlink>
但我需要先为 NavigateUri 属性转换标签,使其成为真正的超链接或 PackUri。
例如,如果我的标签是“folksonomy”,我想创建一个字符串,例如:http://www.example.com/tags/tagview?tag=folksonomy
实现这一目标的最佳方法是什么? XAML 中有字符串操作函数吗?我必须写一个转换器吗?我是否必须构建一个完整的单独 ViewModel 类来进行一些字符串格式化?
更新: 超链接元素似乎发生了一些奇怪的事情。我可以得到答案中建议的 StringFormat 语法,适用于普通 TextBlock 的 Text 属性,但不适用于超链接的 NavigateUri 属性。
正如一个答案所述,这可能是因为 NavigateUri 属性正式采用 Uri,而不是字符串。显然需要自定义转换器或 ViewModel 属性。
【问题讨论】:
【参考方案1】:您可以使用绑定的字符串格式化功能:
<Hyperlink NavigateUri="Binding Tag, StringFormat=http://www.example.com/tags/tagview?tag=0">
<Run Text="Binding Tag" />
</Hyperlink>
【讨论】:
嗯。我可以让它适用于 TextBlock 元素的 Text 属性,但不适用于 Hyperlink 的 NavigateUri 或 Tooltip 属性。 有趣。可能是因为目标类型是Uri
而不是String
。您可能需要使用自己的转换器,或视图模型上的单独属性。
这对于 NavigateUri 方法是有意义的,但有趣的是 Tooltip 也不会采用 StringFormat。似乎 StringFormat 根本没有实现。可能是因为 Hyperlink 位于 System.Windows.Documents 命名空间中?
无论如何,看来我必须使用自定义转换器或 ViewModel 属性来正确格式化字符串。感谢您的帮助!【参考方案2】:
就像 Kent 所说的,假设您使用的是 .NET 3.5 SP1,您可以使用字符串格式(字符串格式是作为 SP1 的一部分添加的)。好的样品在这里:http://blogs.msdn.com/b/llobo/archive/2008/05/19/wpf-3-5-sp1-feature-stringformat.aspx
如果您不在 .NET 3.5 SP1 上或字符串格式方法变得过于混乱,您可能希望我们提供 IValueConverter http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx
【讨论】:
StringFormat 语法仅适用于基础类型为字符串的属性,因此不适用于将 Uri 作为其基础属性的 NavigateUri。我将不得不使用 IValueConverter。【参考方案3】:对于在此线程中寻找解决方案的其他人,我发现 Foovanadil 建议的 IValueConverter 对我来说效果很好。
<TextBlock>
<Hyperlink Name="lnkGoogle" NavigateUri="Binding Path=Alert.Query,Converter=View:UriConverter,ConverterParameter=google" RequestNavigate="Hyperlink_RequestNavigate">
Find news on Google
</Hyperlink>
</TextBlock>
在我的代码隐藏中使用转换器类:
public class UriConverter : MarkupExtension, IValueConverter
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
string address = string.Empty;
switch ((string)parameter)
case "google":
address = "http://www.google.co.uk/news?q=" + value;
break;
Uri path = new Uri(@address);
return path;
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
throw new System.NotImplementedException();
public override object ProvideValue(System.IServiceProvider serviceProvider)
return this;
【讨论】:
以上是关于您可以在 XAML 属性数据绑定期间对超链接的 NavigateUri 属性进行 StringFormat 吗?的主要内容,如果未能解决你的问题,请参考以下文章
XAML - 绑定到 DataContext 并使用转换器?