2010-08-26 28 views
1

有沒有簡單的方法來轉換或格式化字符串作爲WPF數據綁定的一部分?在XAML屬性數據綁定期間,您可以StringFormat超鏈接的NavigateUri屬性嗎?

假設我想創建一個基於字符串標記的WPF超鏈接元素。

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

但我需要先轉換標籤的NavigateUri屬性,使之成爲真正的超鏈接或PackUri。

舉例來說,如果我的標籤是「分衆分類」我要創建這樣一個字符串:http://www.example.com/tags/tagview?tag=folksonomy

什麼是實現這一目標的最佳方式是什麼? XAML中有字符串操作函數嗎?我必須寫一個轉換器嗎?我是否必須構建一個完全獨立的ViewModel類才能進行小字符串格式化?

更新:似乎有一些奇怪的事情與超鏈接元素。我可以得到在爲普通TextBlock的Text屬性工作的答案中建議的StringFormat語法,但不能用於超鏈接的NavigateUri屬性。

作爲一個答案指出,這可能是由於NavigateUri屬性正式接受Uri而不是字符串。顯然自定義轉換器或ViewModel屬性將是必需的。

回答

4

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

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

嗯。我可以讓它適用於TextBlock元素的Text屬性,但不適用於Hyperlink的NavigateUri或Tooltip屬性。 – dthrasher 2010-08-26 23:50:12

+0

有趣。可能是因爲目標類型是'Uri'而不是'String'。您可能需要訴諸自己的轉換器,或者視圖模型上的單獨屬性。 – 2010-08-27 06:52:11

+0

這對NavigateUri方法有意義,但有趣的是Tooltip不會採用StringFormat。看起來好像StringFormat完全沒有實現。也許是因爲Hyperlink存在於System.Windows.Documents命名空間中? – dthrasher 2010-08-27 15:22:33

3

像肯特說,你可以使用字符串格式化假設你是在.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

+0

StringFormat語法僅適用於基礎類型爲字符串的屬性,因此對於NavigateUri不適用,其中Uri作爲其基礎屬性。我將不得不使用IValueConverter。 – dthrasher 2010-12-29 20:51:43

2

對於任何人碰到這個線程絆腳石尋求解決辦法,我發現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; 
     } 
    }