Windows Phone 8使用格式绑定到字符串资源

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:一种选择是添加两个文本块而不是一个,但我不确定这是否是一个好习惯.

Ala*_*oud 6

你有三个选择.

第一个选项:修改视图模型以显示格式化的字符串并绑定到该字符串.

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)

我不知道是否值得付出努力.