Dar*_*n V 3 c# xaml windows-phone-8
我的本地化资源字符串,名称TextResource具有值:Text: {0}.{0}String.Format的占位符在哪里.
我的用户控件有一个DependecyProperty调用Count.
我想绑定Count到文本框的文本,但也应用本地化的字符串.这样文本块的内容是Text: 5(假设值为Count5)
我设法弄清楚如何绑定本地化的字符串
<TextBlock Text="{Binding Path=LocalizedResources.TextResource, Source={StaticResource LocalizedStrings}}" />
Run Code Online (Sandbox Code Playgroud)
或财产价值
<TextBlock Text="{Binding Path=Count}" />
Run Code Online (Sandbox Code Playgroud)
但不是两个同时.
我怎么能在XAML中做到这一点?
PS:一种选择是添加两个文本块而不是一个,但我不确定这是否是一个好习惯.
你有三个选择.
第一个选项:修改视图模型以显示格式化的字符串并绑定到该字符串.
public string CountFormatted {
get {
return String.Format(AppResources.TextResource, Count);
}
}
Run Code Online (Sandbox Code Playgroud)
<TextBlock Text="{Binding Path=CountFormatted}" />
Run Code Online (Sandbox Code Playgroud)
第二种选择:制作转换器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();
}
}
Run Code Online (Sandbox Code Playgroud)
<phone:PhoneApplicationPage.Resources>
<local:MyCountConverter x:Key="MyCountConverter"/>
</phone:PhoneApplicationPage.Resources>
...
<TextBlock Text="{Binding Count, Converter={StaticResource MyCountConverter}}"/>
Run Code Online (Sandbox Code Playgroud)
第三个选项:使用bind-able转换器参数,以便您可以创建一个通用的StringFormat转换器,您可以在其中实际绑定转换器参数.这在Windows手机中不支持开箱即用,但仍然可行.查看此链接,了解如何完成.
但是,除非您使用资源来支持多种语言,否则将格式作为普通字符串传递给转换器要容易得多.
<TextBlock Text="{Binding Count,
Converter={StaticResource StringFormatConverter},
ConverterParameter='Text: {0}'}" />
Run Code Online (Sandbox Code Playgroud)
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();
}
}
Run Code Online (Sandbox Code Playgroud)
<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}}" />
Run Code Online (Sandbox Code Playgroud)
我不知道是否值得付出努力.