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を使用してみてください

例:

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