Как работать без локализованных строк во ViewModel со свойствами привязки данных?

Я не так уж тверд с MVVM, и я надеюсь, что кто-нибудь может мне помочь с этим. Я использую C#/XAML для Windows Phone 8. Обычно мой 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? Или есть другая возможность избежать локализованных строк в модели представления? (Желательно ли в конце концов избегать локализованных строк в модели представления?)

Заранее спасибо!

С уважением, Марк

3 ответа

Решение

Попробуйте использовать 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();
        }
    }
}

Если вы хотите указать фиксированный формат в Xaml, он поддерживает строки формата для таких вещей, как даты. Используйте StringFormat={0:'dd/MM/yyyy'}, например, для DMY. Он также поддерживает ряд предопределенных форматов. Просто выполните поиск "формат даты в привязках xaml" для деталей.

Вы можете создавать локализованные файлы ресурсов:

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"

Другие вопросы по тегам