WPF xml: lang / язык привязки - PullRequest
       6

WPF xml: lang / язык привязки

2 голосов
/ 09 апреля 2011

как я могу связать атрибут языка Listbox или texblock (или атрибут xml: lang).

я хочу показать названия месяцев в настройках конкретного языка

ex:

<TextBlock x:Name="Date" xml:lang="{Binding Lang}">
        <TextBlock.Text>
            <MultiBinding StringFormat=" {0:dd.MMM.yyyy}-{1:dd.MMM.yyyy}">
                <Binding Path="Date1"/>
                <Binding Path="Date2"/>
            </MultiBinding>
</TextBlock.Text>

результат должен быть в соответствии со свойством Lang:

01.Apr.2011 - 01.Apr.2011 en-US

или 01.Nis.2011 - 02.Nis.2011tr-TR

или ....

это дает XamlParseException: атрибут языка не может быть преобразован в тип System.Windows.Markup.XmlLanguage (это не точный текст ошибки.)

Есть идеи?

Ответы [ 2 ]

5 голосов
/ 09 апреля 2011

В событие приложения Startup добавьте эту инструкцию:

FrameworkElement.LanguageProperty.OverrideMetadata(
    typeof(FrameworkElement),
    new FrameworkPropertyMetadata(
        XmlLanguage.GetLanguage(CultureInfo.CurrentCulture.IetfLanguageTag)));

Это переопределит значение по умолчанию свойства Language для текущей культуры для всего приложения.


РЕДАКТИРОВАТЬ: хорошо, я неправильно понял ваш вопрос ...

Если вы хотите связать свойство Language со строкой, содержащей IetfLanguageTag, вам нужен конвертер:

[ValueConversion(typeof(string), typeof(XmlLanguage))]
public class IetfTagToXmlLanguageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string tag = value as string;
        if (tag == null)
            return Binding.DoNothing;
        return XmlLanguage.GetLanguage(tag);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        XmlLanguage lang = value as XmlLanguage;
        if (lang == null)
            return Binding.DoNothing;
        return lang.IetfLanguageTag;
    }
}

Объявите конвертер в ресурсах XAML:

<local:IetfTagToXmlLanguageConverter x:Key="languageConverter" />

И используйте конвертер в привязке:

<TextBlock Language="{Binding Lang, Converter={StaticResource languageConverter}}">
2 голосов
/ 22 октября 2013

вы можете создать вложенное свойство и использовать его.

sealed class CultureBehavior
{
    public static DependencyProperty CultureProperty =
        DependencyProperty.RegisterAttached("Culture",
            typeof (string),
            typeof (CultureBehavior),
            new UIPropertyMetadata(OnCultureChanged));

    public static void SetCulture(FrameworkElement target, string value)
    {
        target.SetValue(CultureProperty, value);
    }

    public static string GetCulture(FrameworkElement target)
    {
        return (string) target.GetValue(CultureProperty);
    }

    private static void OnCultureChanged(DependencyObject target, DependencyPropertyChangedEventArgs args)
    {
        var element = target as FrameworkElement;
        if (element == null) return;

        element.Language = XmlLanguage.GetLanguage(args.NewValue.ToString());
    }
}

XAML

xmlns:local="clr-namespace:App.Utils"
....

<TextBlock Text="{Binding Repairs, StringFormat=c}"  local:CultureBehavior.Culture="{Binding CultureString}" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...