如何根据我的数据绑定选择WPF ComboBox中的项目?

时间:2009-12-03 04:00:24

标签: wpf data-binding xaml

我已将DataContext设置为Book对象。本书有属性:标题,类别。

我有一个CollectionViewSource“categoryList”,其中包含一个类别列表。

问题:如何在此组合框中选择图书的类别?

<TextBox Text="{Binding Path=Title}"/>

<ComboBox SelectedValuePath="Id" 
          SelectedValue="{Binding Path=Category.Id}" 
          SelectedItem="{Binding Path=Category}"
          ItemsSource="{Binding Source = {StaticResource categoryList}}" 
          DisplayMemberPath="Name" />

上面的代码正确显示了书的标题,然后它显示了组合框中的类别名称列表。但它没有选择书的类别。它只是选择列表中的第一项。

2 个答案:

答案 0 :(得分:6)

你的约束太多了;您只需要设置SelectedValueSelectedValuePathSelectedItem。在这种情况下,看起来您实际上正在尝试绑定到特定对象。如果您尝试让ComboBoxCategory上设置Book属性,并且当前Book对象实际上引用了Category实例,那么在categoryList中,您应该使用SelectedItem绑定并删除SelectedValueSelectedValuePath的绑定。

修改

为了进一步说明如何完成此操作,SelectedValue旨在当您有一条共同的信息将链接的项目与列表源上的属性相关联时使用。例如,假设我有一个Book类,其CategoryID属性。

public class Book
{
    public string CategoryID { get; set; }
    public string Title { get; set; }
}

public class CategoryID
{
    public string ID { get; set; }
    public string Name { get; set; }
}

在这种情况下,你会这样做:

<ComboBox SelectedValue = "{Binding CategoryID}"
          SelectedValuePath = "ID"
          DisplayMemberPath = "Name" />
另一方面,

SelectedItem用于当绑定实例具有对绑定列表中的项的实际引用(或更确切地说,等效于对象的对象)时。所以,我们假设Book类实际上是这样的:

public class Book
{
    public Category Category { get; set; }
    public string Title { get; set; }
}

在这种情况下,你会这样做:

<ComboBox SelectedItem = "{Binding Category}"
          DisplayMemberPath = "Name" />

但重要的是要注意,除非Book类引用与列表中的Category相同的实例,否则将无效。如果引用不同(即使类上的值相等),那么这将不起作用,因为ComboBox将无法找到Category中引用的Book在列表中。

你绑定它的方式(通过绑定到Category.ID)的真正问题是你正在混合这些方案。你有一个参考,但你试图绑定密钥。所有这一切都是尝试设置参考值,它不会尝试更改您班级的参考

答案 1 :(得分:1)

在代码中描述Adam正在谈论的内容:

<ComboBox 
     SelectedValuePath="Id"
     SelectedItem="{Binding Path=Category}"
     ItemsSource="{Binding Source={StaticResource categoryList}}"
     DisplayMemberPath="Name" />

可能更合适。通常,最好将SelectedValue视为只读,并使用SelectedItem选择要选择的项目。当您将SelectedItem绑定到图书的Category时,它会自动为您设置SelectedValue属性。

如果仍然无效,您可能需要检查对Category的绑定是否正常。特别是,添加DebugConverter可以很好地确保您期望的值受到约束。 You can see the use of DebugConverter is the answer to this question.

-Doug