WPF组合框显示成员路径

70

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

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

但我认为这对于如此简单的任务来说太繁琐了。我可以使用相对源绑定吗?

7个回答

162

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


10
你没有绑定到类中的数据,而是告诉它从名为“name”的成员命名的类成员获取其数据,因此,如果您的实例具有item.Name == "steve",它正在尝试从item.steve获取数据。
要使此方法起作用,您应该从MemberPath中删除绑定。将其更改为MemberPath = "Name",这告诉它从成员“Name”获取数据。这样它就会调用item.Name,而不是item.steve

7
你应该将 MemberPath="{Binding Name}" 改为 MemberPath="Name"。这样就可以正常工作了。

6

您可以移除 DisplayMemberPath,然后在 TextBlock 中设置路径。
DisplayMemberPath 通常用于没有 ItemTemplate 的情况下。
或者,您可以移除 ItemTemplate 并使用 DisplayMemberPath - 这样它基本上为您创建了一个 TextBlock。

不建议同时执行两个操作。

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

3

另外,您不需要设置DisplayMemberPath。您只需在PromptList中的对象中包含一个覆盖ToString()的方法,就像这样:

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

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

ToString()方法会自动被调用,显示你的类中的Name参数。这适用于ComboBoxes、ListBoxes等控件。

13
这不是一个好的解决方案。ToString() 只是默认和后备策略,而不是将信息呈现给 GUI 的标准方法。 - Michi-2142

1

Trying this :

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


0
从我所了解的情况来看,
"DisplayMemberPath" 使用反射来获取数据上下文类中的属性名称,如果找不到,则不会显示任何内容。
如果类
class some_class{
  string xxx{ get; }
}

DisplayMemberPath=xxx,将显示“xxx”所代表的任何值。

如果您想要连接数据上下文中的属性,您需要创建一个项模板,该模板将显示在标题和下拉列表中。

<ComboBox.ItemTemplate>
          <DataTemplate DataType="employee">
            <StackPanel Orientation="Horizontal">
              <TextBlock Text="{Binding first_name}" />
              <TextBlock Text="" />
              <TextBlock Text="{Binding last_name}" />
            </StackPanel>
          </DataTemplate>
        </ComboBox.ItemTemplate>

您不能同时设置“DisplayMemberPath”和“ComboBox.ItemTemplate”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接