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

Abb*_*ner 6 data-binding wpf xaml

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

我有一个CollectionViewSource"categoryList",它包含一个Categories列表.

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

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

<ComboBox SelectedValuePath="Id" 
          SelectedValue="{Binding Path=Category.Id}" 
          SelectedItem="{Binding Path=Category}"
          ItemsSource="{Binding Source = {StaticResource categoryList}}" 
          DisplayMemberPath="Name" />
Run Code Online (Sandbox Code Playgroud)

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

Ada*_*son 6

你的约束太多了; 你只需要设置SelectedValueSelectedValuePath,或SelectedItem.在这种情况下,看起来您实际上正在尝试绑定到特定对象.如果你想拥有ComboBox一套Category你的财产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; }
}
Run Code Online (Sandbox Code Playgroud)

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

<ComboBox SelectedValue = "{Binding CategoryID}"
          SelectedValuePath = "ID"
          DisplayMemberPath = "Name" />
Run Code Online (Sandbox Code Playgroud)

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

public class Book
{
    public Category Category { get; set; }
    public string Title { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

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

<ComboBox SelectedItem = "{Binding Category}"
          DisplayMemberPath = "Name" />
Run Code Online (Sandbox Code Playgroud)

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

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