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)的真正问题是你正在混合这些方案.你有一个参考,但你试图绑定密钥.所有这一切都是尝试在您的引用上设置值,它不会尝试更改您的类的引用.
| 归档时间: |
|
| 查看次数: |
4695 次 |
| 最近记录: |