簡體   English   中英

在XAML屬性數據綁定期間,您可以StringFormat超鏈接的NavigateUri屬性嗎?

[英]Can you StringFormat the NavigateUri property for Hyperlinks during XAML property databinding?

有沒有簡單的方法可以將字符串轉換或格式化為WPF數據綁定的一部分?

假設我想基於字符串標簽創建WPF超鏈接元素。

<Hyperlink NavigateUri="{Binding Tag}">
    <Run Text="{Binding Tag}" />
</Hyperlink>

但是我需要先轉換NavigateUri屬性的Tag,以使其成為真正的超鏈接或PackUri。

例如,如果我的標簽是“ folksonomy”,我想創建一個字符串,例如: http://www.example.com/tags/tagview?tag=folksonomy : http://www.example.com/tags/tagview?tag=folksonomy tag=folksonomy

實現此目標的最佳方法是什么? XAML中是否有字符串處理功能? 我必須寫一個轉換器嗎? 我是否需要構建整個單獨的ViewModel類來進行一些字符串格式化?

更新:超鏈接元素似乎發生了一些奇怪的事情。 我可以得到答案中建議的StringFormat語法,以用於普通TextBlock的Text屬性,而不適用於Hyperlink的NavigateUri屬性。

正如一個答案指出的那樣,這很可能是由於NavigateUri屬性正式采用了Uri,而不是字符串。 顯然,將需要一個自定義轉換器或ViewModel屬性。

您可以使用綁定的字符串格式化功能:

<Hyperlink NavigateUri="{Binding Tag, StringFormat=http://www.example.com/tags/tagview?tag={0}}">
    <Run Text="{Binding Tag}" />
</Hyperlink>

就像肯特(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/zh-cn/library/system.windows.data.ivalueconverter.aspx

對於在此線程中絆腳石尋求解決方案的其他人,我發現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;
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM