WPFcomboboxDisplayMemberPath

好吧,我看了其他问题,似乎没有得到我的答案,所以希望在这里有人可以。

非常简单的问题为什么DisplayMemberPath属性不绑定到该项目?

<ComboBox Grid.Row="1" Grid.Column="2" ItemsSource="{Binding PromptList}" DisplayMemberPath="{Binding Name}" SelectedItem="{Binding Prompt}"/> 

跟踪输出显示它试图绑定到IEnumerable而不是IEnumerable中的实际项目。 我很困惑,一个简单的方法来填充一个combobox,而不用在xaml中添加一行。

它只是在itemssource中为对象调用ToString()。 我有一个工作,这是这样的:

 <ComboBox Grid.Row="1" Grid.Column="2" ItemsSource="{Binding PromptList}" SelectedItem="{Binding Prompt}"> <ComboBox.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Name}"/> </DataTemplate> </ComboBox.ItemTemplate> </ComboBox> 

但在我看来,这么简单的任务太多了。 我可以使用一个relativesource绑定吗?

DisplayMemberPath指定每个项目的显示string属性的path。 在你的情况下,你将它设置为"Name" ,而不是"{Binding Name}"

你没有绑定到类中的数据,你告诉它从成员“name”所指定的类成员获取数据,所以如果你的实例有item.Name == "steve"它正试图从item.steve获取数据。

为此,您应该从MemberPath中删除绑定。 将其更改为MemberPath = "Name"这告诉它从成员“Name”获取数据。 这样它会调用item.Name ,而不是item.steve

您可以删除DisplayMemberPath,然后在TextBlock中设置path。
当没有ItemTemplate时,DisplayMemberPath是真正的。
或者您可以删除您的ItemTemplate并使用DisplayMemberPath – 在这种情况下,它基本上为您创build一个TextBlock。 不build议你做两个。

  <TextBlock text="{Binding Path=Name, Mode=OneWay}" 

您应该将MemberPath="{Binding Name}"更改为MemberPath="Name" 。 然后它会工作。

或者,您不需要设置DisplayMemberPath。 你可以在PromptList中的对象中包含一个覆盖ToString()。 喜欢这个:

 class Prompt { public string Name = ""; public string Value = ""; public override string ToString() { return Name; } } 

ToString()将自动被调用并显示你的类的Name参数。 这适用于ComboBoxes,ListBoxes等