1

我对 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 中进行本地化?或者是否有另一种可能避免视图模型中的本地化字符串?(毕竟在视图模型中避免本地化字符串是可取的吗?)

提前致谢!

问候, 马克

4

3 回答 3

0

如果您希望在 Xaml 中指定固定格式,它确实支持日期等格式字符串。以 DMY 为例,使用 StringFormat={0:'dd/MM/yyyy'}。它还支持许多预定义的格式。只需搜索“xaml 绑定中的日期格式”即可了解详细信息。

于 2012-10-31T12:37:34.100 回答
0

您可以创建本地化资源文件:

字符串.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”

于 2012-10-31T12:39:55.447 回答
0

尝试使用IValueConverter

例子:

xml:

<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();
        }
    }
}
于 2012-10-31T12:42:04.417 回答