Есть ли способ создать динамический список строк (на основе языка) в XAML (Silverlight)? - PullRequest
0 голосов
/ 15 апреля 2010

Просто интересно, возможно ли динамически создать список строк в XAML на основе языка / культуры? Скажем, если пользователь входит в систему как английский пользователь, он показывает имя клиента, номер заказа ... и если пользователь входит в систему как польский пользователь, он показывает Nazwa klienta, Numer zamówienia?

Я знаю только одно закодированное, как показано ниже:

        <System_Collections_Generic:List`1 x:Key="columnNameList">
            <System:String>Client Name</System:String>
            <System:String>Order Number</System:String>
            <System:String>Date</System:String>
        </System_Collections_Generic:List`1>

1 Ответ

0 голосов
/ 15 апреля 2010

Я бы предложил использовать файл ресурсов и расширение разметки. В файле ресурсов вы создаете строковые ресурсы и создаете локализованные файлы ресурсов для каждого языка. В расширении разметки вы просто возвращаете значение строки из ресурсов (оно автоматически выберет соответствующий язык из сборки ресурсов спутника для текущей культуры).

Расширение разметки

[MarkupExtensionReturnType(typeof(string))]
public class ResourceString : MarkupExtension
{
    [ConstructorArgument("resourceKey")]
    public string ResourceKey { get; set; }

    public ResourceString(string resourceKey)
    {
        this.ResourceKey = resourceKey;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        // Assuming your resource file is named StringResources.resx
        return StringResources.ResourceManager.GetString(ResourceKey);
    }
}

XAML

    <local:ListOfStrings x:Key="columnNameList">
        <local:ResourceString ResourceKey="ClientName" />
        <local:ResourceString ResourceKey="OrderNumber" />
        <local:ResourceString ResourceKey="Date" />
    </local:ListOfStrings>

Кстати, вы не можете использовать дженерики в XAML (ну, вы можете использовать в XAML 2009, но это еще не поддерживается в VS) Поэтому вам нужно создать неуниверсальный класс, представляющий список строк:

public class ListOfStrings : List<string> { }
...