【问题标题】:Can you StringFormat the NavigateUri property for Hyperlinks during XAML property databinding?您可以在 XAML 属性数据绑定期间对超链接的 NavigateUri 属性进行 StringFormat 吗?
【发布时间】: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 属性。

【问题讨论】:

    标签: wpf xaml string hyperlink string-formatting


    【解决方案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;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 2018-05-10
      • 2018-03-12
      • 2013-09-24
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      • 1970-01-01
      • 2015-03-29
      • 1970-01-01
      相关资源
      最近更新 更多