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()
方法的结果。
DisplayMemberPath
和 ItemTemplate
对项目不起作用,因为 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>
我有一个 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()
方法的结果。
DisplayMemberPath
和 ItemTemplate
对项目不起作用,因为 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>