首页 文章

WPF Combobox DisplayMemberPath

提问于
浏览
52

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

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

5 回答

  • 129

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

  • 8

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

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

  • 2

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

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

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

  • 5

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

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

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

相关问题