【问题标题】:WPF Combobox DisplayMemberPathWPF 组合框 DisplayMemberPath
【发布时间】:2009-09-22 14:58:26
【问题描述】:

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

非常简单的问题,为什么 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>

但在我看来,这样一个简单的任务太过分了。我可以使用相对源绑定吗?

【问题讨论】:

    标签: wpf combobox


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        您应该将MemberPath="{Binding Name}" 更改为MemberPath="Name"。然后就可以了。

        【讨论】:

          【解决方案4】:

          您可以删除 DisplayMemberPath,然后在 TextBlock 中设置路径。
          DisplayMemberPath 确实适用于没有 ItemTemplate 的情况。
          或者您可以删除您的 ItemTemplate 并使用 DisplayMemberPath - 在这种情况下,它基本上会为您创建一个 TextBlock。 不建议你两者都做。

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

          【讨论】:

            【解决方案5】:

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

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

            将自动调用 ToString() 并显示您的类中的 Name 参数。这适用于组合框、列表框等。

            【讨论】:

            • 这不是一个好的解决方案。 ToString() 只是默认和后备策略,而不是向 GUI 提供信息的标准。
            【解决方案6】:

            试试这个:

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

            【讨论】:

              猜你喜欢
              • 2013-01-12
              • 2018-01-10
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-02-04
              • 1970-01-01
              • 1970-01-01
              • 2019-04-30
              相关资源
              最近更新 更多