2009-09-22 117 views
40

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

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

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

跟踪输出显示,它正试图绑定到类保持了IEnumerable不是在IEnumerable的实际项目。我很困惑,以一种简单的方式来填充组合框,而不用在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绑定吗?

回答

115

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

+0

你绝对惊人,我不能相信我错过了明显的。 – Jose 2009-09-22 15:02:41

+0

很高兴帮助! (有些填充符合SO) – 2009-09-22 15:06:33

+0

这里同样的问题。谢谢你 - 所以再次拯救! – 2010-08-26 16:50:59

7

您没有绑定到类中的数据,而是告诉它从由成员“name”命名的类成员获取数据,因此,如果您的实例有item.Name == "steve"它正在尝试获取数据从item.steve

为此,您应该从MemberPath中删除绑定。将其更改为MemberPath = "Name"这表明它从成员“名称”获取数据。这样,它会拨打item.Name,而不是item.steve

5

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

5

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

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

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

class Prompt { 
    public string Name = ""; 
    public string Value = ""; 

    public override string ToString() { 
     return Name; 
    } 
} 

了toString()会自动调用并显示你的类名称参数。这适用于ComboBoxes,ListBoxes等。

+5

这不是一个好的解决方案。 ToString()只是默认和回退策略,并不是将信息传递给GUI的标准。 – 2015-03-30 12:13:12