DisplayMemberPath 不适用于直接项目?

DisplayMemberPath not working with direct items?

我有一个 ListBox(或 ComboBox,我都试过了),其中项目直接通过 ListBoxItem (ComboBoxItem) 元素添加。

数据是 CultureInfo 个对象,来自元素中(或上面某个地方)的两个 ObjectDataProvider 资源。调用了 CultureInfo.GetCultureInfo 静态方法。

简而言之,我想要一个 ListBox/ComboBox 填充一些 CultureInfo 条目。

数据绑定工作正常,但将 DisplayMemberPath 设置为 CultureInfo 属性之一(例如 DisplayName - 我希望显示 "English",不是 "en-US") 没有任何反应。 奇怪的是,如果我尝试使用 ComboBox 和 select 其中一项,DisplayMemberPath 会作用于 selected 值(显示在文本框中),但不会作用于下拉列表。

我的问题是:我错过了什么吗?还是 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>

注意:使用 ItemTemplate 也不起作用。

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

目前每个 ListBoxItem 显示 CultureInfo 对象上 ToString() 方法的结果。

DisplayMemberPathItemTemplate 对项目不起作用,因为 ListBoxItem 是直接添加的,而不是由 ListBox 创建的。

在绑定路径中添加DisplayName

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

使用自定义 ContentTemplate 为 ListBoxItem 创建默认样式:

<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>