我已将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" />
上面的代码正确显示了书的标题,然后它显示了组合框中的类别名称列表。但它没有选择书的类别。它只是选择列表中的第一项。
答案 0 :(得分:6)
你的约束太多了;您只需要设置SelectedValue
和SelectedValuePath
或SelectedItem
。在这种情况下,看起来您实际上正在尝试绑定到特定对象。如果您尝试让ComboBox
在Category
上设置Book
属性,并且当前Book
对象实际上引用了Category
实例,那么在categoryList
中,您应该使用SelectedItem
绑定并删除SelectedValue
和SelectedValuePath
的绑定。
修改强>
为了进一步说明如何完成此操作,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