WPF локализованный TreeView с HierarchicalDataTemplate - PullRequest
1 голос
/ 15 февраля 2011

Вот в чем дело:

У меня есть простое приложение WPF Windows, в которое я включил TreeView, которое создается с помощью HierarchicalDataTemplate и снабжается некоторыми иерархическими данными.

Иерархическая структура данных состоит из класса FakeRec, который содержит дочерние элементы в List<FakeRec>. Каждый элемент содержит свойство строки заголовка. Итак, в моем XAML у меня есть:

...
<HierarchicalDataTemplate ItemsSource="{Binding Items}" DataType="{x:Type local:FakeRec}">
...
     <TextBlock Grid.Column="0" Text="{Binding Path=Title}"/>
...
</HierarchicalDataTemplate>
...

Это отлично работает, и в сгенерированном TreeView я вижу заголовок каждого узла.

Теперь я хочу сделать все это дерево локализуемым. У меня есть свои ресурсы в FakeDirResources.Resx (в отдельной сборке, но это не имеет значения). Если я сделаю это:

...
<HierarchicalDataTemplate ItemsSource="{Binding Items}" DataType="{x:Type local:FakeRec}">
...
    <TextBlock Grid.Column="0" Text="{Binding Path=Title, Source={StaticResource FakeDirResources}}"/>
...
</HierarchicalDataTemplate>
...

Мое дерево пустое (очевидно, потому что в моем файле FakeDirResources.resx у меня нет ресурса с ключом Title, но мне нужно использовать Title другой привязки, разрешить его с помощью ресурсов, а затем каким-то образом связать результат с деревом.

Обратите внимание, что если я просто помещу TextBlock в окно, без связи с деревом или с HierarchicalDataTemplate, я могу без проблем привязать его к ресурсам, например:

<TextBlock Text="{Binding Path=games, Source={StaticResource FakeDirResources}}"/>;

Это прекрасно работает, выбирая строку, и если я изменю System.Threading.Thread.CurrentThread.CurrentUICulture и обновлю свой провайдер, эта строка изменится на новый язык.

Вопрос в том, как мне объединить два? Что мне не хватает? Я предполагаю, что должен быть какой-то трюк (и с моим коротким опытом работы с WPF это, вероятно, не простой трюк).

Ура!

Alon.

1 Ответ

1 голос
/ 16 февраля 2011

Потенциально вы могли бы работать через это с IValueConverter:

public class KeyResourceConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType,
        object parameter, CultureInfo culture)
    {
        var key = System.Convert.ToString(value);
        var lookup = parameter as ResourceManager;

        return lookup.GetString(key, culture);
    }

    public object ConvertBack(object value, Type targetType,
        object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

Используется так:

<TextBlock Text="{Binding Path=Title,
                          Converter={StaticResource keyResource}
                          ConverterParameter={x:Static local:FakeDirResources.ResourceManager}}"
           />
...