我对MVVM不是那么坚定,我希望有人可以帮助我。我在Windows Phone 8上使用C#/ XAML。 通常我的ViewModel提供了一个属性MyProperty,我会像这样绑定它:
<TextBlock Text="{Binding MyProperty, StringFormat='This Property: {0}'}" FontSize="30" />
问题是在我的视图模型中有一些数据绑定属性,这些属性由不同的字符串本地化。例如。假设你有约会 - 无论是即将到来还是已经过去了。此日期应如下所示:
upcoming: "The selected date {0:d} is in the future"
passed: "The selected date {0:d} already passed"
是否可以在XAML中进行本地化?或者是否有另一种可能性来避免视图模型中的本地化字符串? (毕竟,是否可以避免视图模型中的本地化字符串?)
提前致谢!
此致 马克
答案 0 :(得分:0)
如果您希望在Xaml中指定固定格式,它确实支持日期之类的格式字符串。例如,对于DMY,请使用StringFormat = {0:'dd / MM / yyyy'}。它还支持许多预定义的格式。只需搜索“xaml绑定中的日期格式”以获取详细信息。
答案 1 :(得分:0)
您可以创建本地化的resorce文件:
String.xaml
<system:String x:Key="MyKey">English {0} {1}</system:String>
String.de-DE.xaml
<system:String x:Key="MyKey">{0} Deutsch {1}</system:String>
而不是按键在视图中使用字符串。如果你需要占位符,你可以用这样的多重绑定填充它们:
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{StaticResource MyKey}">
<Binding Path="MyObject.Property1" />
<Binding Path="MyObject.Property2" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
如果MyObject.Property1为“text1”且MyObject.Property2为“text2”,则英语结果为“English text1 text2”,德语为“text1 Deutsch text2”
答案 2 :(得分:0)
尝试使用IValueConverter
示例:
的Xaml:
<Window x:Class="ConverterSpike.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:ConverterSpike="clr-namespace:ConverterSpike"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<ConverterSpike:DateStringConverter x:Key="DateConverter" />
</Window.Resources>
<Grid>
<TextBlock Text="{Binding MyProperty, Converter={StaticResource DateConverter}}" />
</Grid>
</Window>
转换器:
using System;
using System.Globalization;
using System.Windows.Data;
namespace ConverterSpike
{
public class DateStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null) return string.Empty;
var date = value as string;
if (string.IsNullOrWhiteSpace(date)) return string.Empty;
var formattedString = string.Empty; //Convert to DateTime, Check past or furture date, apply string format
return formattedString;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}