DisplayMemberPath не работает с прямыми элементами? - PullRequest
2 голосов
/ 17 марта 2020

У меня есть ListBox (или ComboBox, я пробовал оба), где элементы добавляются напрямую через ListBoxItem (ComboBoxItem) элементов.

Данные CultureInfo объекты, поступающие из двух ObjectDataProvider ресурсов в элементе (или в каком-то месте выше). Вызывается метод CultureInfo.GetCultureInfo stati c.

Одним словом, я хотел бы заполнить ListBox/ComboBox некоторыми записями CultureInfo.

Привязка данных работает нормально , но при установке DisplayMemberPath в одно из свойств CultureInfo (например, DisplayName - я бы хотел, чтобы отображался «Engli sh», а не «en-US»), ничего не происходит , Как ни странно, если я пытаюсь с помощью ComboBox и выбрать один из элементов, DisplayMemberPath работает с выбранным значением (которое отображается в текстовом поле), но не с раскрывающимся списком.

Мой вопрос : я что-то пропустил? Или DisplayMemberPath не работает с прямыми элементами и только тогда, когда ItemsSource привязан к коллекции (только предположение)?

<ListBox x:Name="LangListBox" DisplayMemberPath="DisplayName">
    <ListBox.Resources>
        <ObjectDataProvider x:Key="EngCultureInfoProvider" ObjectType="{x:Type Globalization:CultureInfo}" MethodName="GetCultureInfo">
            <ObjectDataProvider.MethodParameters>
                <System:String>en-US</System:String>
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
        <ObjectDataProvider x:Key="ItaCultureInfoProvider" ObjectType="{x:Type Globalization:CultureInfo}" MethodName="GetCultureInfo">
            <ObjectDataProvider.MethodParameters>
                <System:String>it-IT</System:String>
            </ObjectDataProvider.MethodParameters>
        </ObjectDataProvider>
    </ListBox.Resources>
    <ListBoxItem Content="{Binding Source={StaticResource EngCultureInfoProvider}}"/>
    <ListBoxItem Content="{Binding Source={StaticResource ItaCultureInfoProvider}}"/>
</ListBox>

ListBox

ComboBox

Примечание: использование ItemTemplate также не работает.

...
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding DisplayName}"/>
        </DataTemplate>
    </ListBox.ItemTemplate>
...

1 Ответ

2 голосов
/ 17 марта 2020

В настоящее время каждый ListBoxItem отображает результат метода ToString() для объекта CultureInfo.

DisplayMemberPath и ItemTemplate не работают для элементов, поскольку ListBoxItem добавляются напрямую, а не создаются ListBox.

Добавить DisplayName в пути привязки:

<ListBoxItem Content="{Binding Source={StaticResource EngCultureInfoProvider}, Path=DisplayName}"/>
<ListBoxItem Content="{Binding Source={StaticResource ItaCultureInfoProvider}, Path=DisplayName}"/>

или

создать стиль по умолчанию для ListBoxItem с пользовательским ContentTemplate:

<ListBox x:Name="LangListBox" DisplayMemberPath="DisplayName">
    <ListBox.Resources>
        <Style TargetType="ListBoxItem">
            <Setter Property="ContentTemplate">
                <Setter.Value>
                    <DataTemplate DataType="{x:Type Globalization:CultureInfo}">
                        <TextBlock Text="{Binding DisplayName}"/>
                    </DataTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ListBox.Resources>
    <ListBoxItem Content="{Binding Source={StaticResource EngCultureInfoProvider}}"/>
    <ListBoxItem Content="{Binding Source={StaticResource ItaCultureInfoProvider}}"/>
</ListBox>
...