完整的数据绑定的语法说明可以在这里查看:
MSDN资料:
Data Binding: Part 1
Data Binding: Part 2
Data Binding Overview
INotifyPropertyChanged接口 绑定的数据源对象一般都要实现INotifyPropertyChanged接口。
{Binding} 说明了被绑定控件的属性的内容与该控件的DataContext属性关联,绑定的是其DataContext代表的整个控件的内容。如下:
<ContentControl Name="LongPreview" Grid.Row="2" Content="{Binding}" HorizontalAlignment="Left"/>ContentControl 只是一个纯粹容纳所显示内容的一个空控件,不负责如何具体显示各个内容,借助于DataTemplate可以设置内容的显示细节。使用参数Path
(使用父元素的DataContext)使用参数绑定,且在数值变化时更新数据源。(两种写法)
相对资源RelativeSource
RelativeSource={RelativeSource Self}是一个特殊的绑定源,表示指向当前元素自己。自己绑定自己,将ToolTip属性绑定到Validation.Errors中第一个错误项的错误信息(Validation.Errors)[0].ErrorContent。
使用转换器和验证规则
使用数据触发器
SpecialFeatures是一个枚举数据类型。
多重绑定
绑定源是多个源,绑定目标与绑定源是一对多的关系。
Master-Detail:主-从应用(使用CollectionViewSource)
说明:
AuctionItems的定义为:public ObservableCollection<AuctionItem> AuctionItems 。在 ListBox 中直接使用 CollectionViewSource 来表示主数据(AuctionItem集合),在 ContentControl 中则同时使用设定 Content 和 ContentControl 两个属性, Content 直接指向CollectionViewSource, ContentControl 则使用先前已经定义的数据模板绑定(数据模板中的数据项则是绑定到AuctionItem类的各个属性)。数据分组(使用CollectionViewSource)分组表头项的数据模板:
<DataTemplate x:Key="groupingHeaderTemplate"> <TextBlock Text="{Binding Path=Name}" Foreground="Navy" FontWeight="Bold" FontSize="12" /></DataTemplate>在ListBox中使用分组:<ListBox Name="Master" Grid.Row="2" Grid.ColumnSpan="3" Margin="8" ItemsSource="{Binding Source={StaticResource listingDataView}}"> <ListBox.GroupStyle> <GroupStyle HeaderTemplate="{StaticResource groupingHeaderTemplate}"/> </ListBox.GroupStyle></ListBox>分组开关:<CheckBox Name="Grouping" Grid.Row="1" Grid.Column="0" Margin="8" Style="{StaticResource checkBoxStyle}" Checked="AddGrouping" Unchecked="RemoveGrouping">Group by category</CheckBox>CheckBox的事件处理:private void AddGrouping(object sender, RoutedEventArgs e){ PropertyGroupDescription pgd = new PropertyGroupDescription(); pgd.PropertyName = "Category"; //使用属性Category的数值来分组 listingDataView.GroupDescriptions.Add(pgd);}private void RemoveGrouping(object sender, RoutedEventArgs e){ listingDataView.GroupDescriptions.Clear();}排序数据(使用CollectionViewSource) 比分组简单
排序开关:<CheckBox Name="Sorting" Grid.Row="1" Grid.Column="3" Margin="8" Style="{StaticResource checkBoxStyle}" Checked="AddSorting" Unchecked="RemoveSorting">Sort by category and date</CheckBox>CheckBox的事件处理:private void AddSorting(object sender, RoutedEventArgs e){ listingDataView.SortDescriptions.Add(new SortDescription("Category", ListSortDirection.Ascending)); listingDataView.SortDescriptions.Add(new SortDescription("StartDate", ListSortDirection.Descending));}private void RemoveSorting(object sender, RoutedEventArgs e){ listingDataView.SortDescriptions.Clear();}过滤数据(使用CollectionViewSource) 跟排序类似
过滤开关:<CheckBox Name="Filtering" Grid.Row="1" Grid.Column="1" Margin="8" Style="{StaticResource checkBoxStyle}" Checked="AddFiltering" Unchecked="RemoveFiltering">Show only bargains</CheckBox>CheckBox的事件处理:private void AddFiltering(object sender, RoutedEventArgs e){ listingDataView.Filter += new FilterEventHandler(ShowOnlyBargainsFilter);}private void RemoveFiltering(object sender, RoutedEventArgs e){ listingDataView.Filter -= new FilterEventHandler(ShowOnlyBargainsFilter);}private void ShowOnlyBargainsFilter(object sender, FilterEventArgs e){ AuctionItem product = e.Item as AuctionItem; if (product != null) { //设置e.Accepted的值即可 e.Accepted = product.CurrentPrice < 25; }}