2013-05-20 91 views
3

我的本地化資源字符串名爲TextResource的值爲:Text: {0}。其中{0}是String.Format的佔位符。Windows Phone 8綁定到字符串資源格式爲

我的用戶控件具有名爲Count的DependecyProperty。

我想將Count綁定到文本框的文本,但也應用本地化的字符串。因此,該文本塊的內容是Text: 5(假設Count值爲5)

我設法弄清楚如何本地化的字符串

<TextBlock Text="{Binding Path=LocalizedResources.TextResource, Source={StaticResource LocalizedStrings}}" /> 

或屬性值綁定

<TextBlock Text="{Binding Path=Count}" /> 

但不是兩者同時發生。

我該如何在XAML中做到這一點?

PS:一種選擇是添加兩個文本塊而不是一個,但我不確定這是否是一種好的做法。

回答

6

這裏有三個選項。

第一個選項:修改您的視圖模型以顯示格式化的字符串並綁定到該模型。

public string CountFormatted { 
    get { 
    return String.Format(AppResources.TextResource, Count); 
    } 
} 
<TextBlock Text="{Binding Path=CountFormatted}" /> 

第二個選項:做一個轉換器MyCountConverter

public class MyCountConverter: IValueConverter { 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
    if (value == null) 
     return value; 

    return String.Format(culture, AppResources.TextResource, value); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
    throw new NotImplementedException(); 
    } 
} 
<phone:PhoneApplicationPage.Resources> 
    <local:MyCountConverter x:Key="MyCountConverter"/> 
</phone:PhoneApplicationPage.Resources> 
... 
<TextBlock Text="{Binding Count, Converter={StaticResource MyCountConverter}}"/> 

第三選項:使用綁定,能夠轉換參數,這樣就可以使一個普通的StringFormat轉換器哪裏你可以實際綁定轉換器參數。這在windows phone中並不支持,但仍然可行。請檢查this關於如何完成的鏈接。

但是,除非您使用資源來支持多種語言,否則將格式作爲普通字符串傳遞給轉換器會更容易。

<TextBlock Text="{Binding Count, 
        Converter={StaticResource StringFormatConverter}, 
        ConverterParameter='Text: {0}'}" /> 

在這種情況下,您必須製作一個使用參數的StringFormatConverter轉換器。

編輯:

關於第三個選項,你可以使用IMultiValueConverter在上面的鏈接,以達到你想要的東西。您可以添加以下轉換器:

public class StringFormatConverter: IMultiValueConverter { 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) { 
    var param = values[0].ToString(); 
    var format = values[1].ToString(); 

    return String.Format(culture, format, param); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) { 
    throw new NotImplementedException(); 
    } 
} 
<TextBlock Text="{Binding ElementName=MultiBinder, Path=Output}" /> 

<binding:MultiBinding x:Name="MultiBinder" Converter="{StaticResource StringFormatConverter}" 
    NumberOfInputs="2" 
    Input1="{Binding Path=Count, Mode=TwoWay}" 
    Input2="{Binding Path=LocalizedResources.TextResource, Source={StaticResource LocalizedStrings}}" /> 

我不知道這是否是值得的,雖然。

+0

非常感謝!選項#3是否可以將ConverterParameter綁定到資源文件中的資源?我試過了,失敗了...... –

+0

是的,請參閱我的編輯。 –