WPF Combobox DisplayMemberPath

时间:2009-09-22 14:58:26

标签: wpf combobox

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

非常简单的问题为什么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绑定吗?

6 个答案:

答案 0 :(得分:133)

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

答案 1 :(得分:8)

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

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

答案 2 :(得分:6)

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

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

答案 3 :(得分:5)

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

答案 4 :(得分:3)

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

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

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

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

答案 5 :(得分:0)

尝试一下:

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