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)
上面的代码正确显示了书的标题,然后它显示了组合框中的类别名称列表.但它没有选择书的类别.它只是选择列表中的第一项.
你的约束太多了; 你只需要设置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; }
}
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
)的真正问题是你正在混合这些方案.你有一个参考,但你试图绑定密钥.所有这一切都是尝试在您的引用上设置值,它不会尝试更改您的类的引用.