您可以在 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 并使用转换器?

C#如何在没有 XAML 的情况下创建到父元素的(两种方式)数据绑定

XAML数据绑定(Data Binding)

Xamarin XAML语言教程控件模板的模板绑定

通过多个 .xaml 文件进行数据绑定

WPF 绑定