【发布时间】:2008-08-11 01:34:34
【问题描述】:
谁能给我指出一个好的资源(或给我一个线索)来告诉我如何在 WPF 中对控件(组合框、列表框等)进行数据绑定?当我所有的 WinForms 优点都被拿走时,我有点不知所措,而且我一开始也不是那么聪明......
【问题讨论】:
标签: wpf data-binding
谁能给我指出一个好的资源(或给我一个线索)来告诉我如何在 WPF 中对控件(组合框、列表框等)进行数据绑定?当我所有的 WinForms 优点都被拿走时,我有点不知所措,而且我一开始也不是那么聪明......
【问题讨论】:
标签: wpf data-binding
我为 WPF 数据绑定找到的最佳资源是 Bea Costa's blog。从第一篇文章开始并向前阅读。太棒了。
【讨论】:
我发现Windows Client .Net 上的教程视频同样棒极了。 Dot Net Rocks TV前段时间也报道过。
【讨论】:
在后面的代码中 -- 将列表框的 DataContext 设置为您要绑定到的集合。
private void OnInit(object sender, EventArgs e)
{
//myDataSet is some IEnumerable
// myListBox is a ListBox control.
// Set the DataContext of the ListBox to myDataSet
myListBox.DataContext = myDataSet;
}
在 XAML 中,Listbox 可以使用“绑定”语法声明它绑定到哪些属性。
<ListBox Name="myListBox" Height="200"
ItemsSource="{Binding Path=BookTable}"
ItemTemplate ="{StaticResource BookItemTemplate}"/>
【讨论】:
还有一些链接,以防以上内容不够:
Windows Presentation Foundation - Data Binding How-to Topics
- 来自 MSDN 的大约 30 篇“操作方法”文章。
“本节中的主题描述了如何使用数据绑定将元素绑定到来自各种数据源(以公共语言运行时 (CLR) 对象和 XML 的形式)的数据。”
Moving Toward WPF Data Binding One Step at a Time
- WPF 大师 Josh Smith
“这篇文章解释了 WPF 数据绑定的绝对基础知识。它展示了如何执行相同简单任务的四种不同方式。每次迭代都更接近于最紧凑的、仅 XAML 的实现。这篇文章适用于没有 WPF 经验的人数据绑定。”
【讨论】:
这是另一个来自 MSDN 的好资源:Data Binding Overview。
【讨论】:
你需要做三件事:
因此,例如,如果您的数据上下文对象是一个拥有电子邮件地址的人,并且您想选择他们的主要地址,那么您可能有具有这些签名的类:
public class EmailAddress
{
public string AddressAsString { get; set; }
}
public class Person
{
public IEnumerable<EmailAddress> EmailAddresses { get; }
public EmailAddress MainEmailAddress { get; set; }
}
然后你可以像这样创建组合框:
<ComboBox ItemsSource="{Binding EmailAddresses}" SelectedItem="{Binding MainEmailAddress}">
<ComboBox.ItemTemplate>
<DataTemplate>
<ComboBoxItem Content="{Binding AddressAsString}"/>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
现在您需要在 Person 和 EmailAddress 中实现 INotifyPropertyChanged。对于 EmailAddresses 集合,您可以使用 ObjservableCollection 支持它。
或者您也可以使用Update Controls .NET。这是一个替代数据绑定的开源项目,不需要 INotifyPropertyChanged。您可以使用任何有意义的集合来支持 EmailAddresses 属性。 XAML 的工作方式与上述相同,只是您导入 UpdateControls.XAML 命名空间并将 {Binding ...} 替换为 {u:Update ...}。
【讨论】: