WPF中的数据绑定Data Binding使用小结

完整的数据绑定的语法说明可以在这里查看:

http://www.nbdtech.com/Free/WpfBinding.pdf

MSDN资料:

Data Binding: Part 1 http://msdn.microsoft.com/en-us/library/aa480224.aspx

Data Binding: Part 2 http://msdn.microsoft.com/en-us/library/aa480226.aspx

Data Binding Overview http://msdn.microsoft.com/en-us/library/ms752347.aspx

INotifyPropertyChanged接口   绑定的数据源对象一般都要实现INotifyPropertyChanged接口。

{Binding}  说明了被绑定控件的属性的内容与该控件的DataContext属性关联,绑定的是其DataContext代表的整个控件的内容。如下:
<ContentControl Name="LongPreview" Grid.Row="2" Content="{Binding}" HorizontalAlignment="Left"/>
ContentControl 只是一个纯粹容纳所显示内容的一个空控件,不负责如何具体显示各个内容,借助于DataTemplate可以设置内容的显示细节。

     使用参数Path

(使用父元素的DataContext)使用参数绑定,且在数值变化时更新数据源。(两种写法)

<TextBox Text="{Binding Path=Name, UpdateSourceTrigger=PropertyChanged}"/>
<TextBox.Text>
<Binding Path="StartPrice" UpdateSourceTrigger="PropertyChanged"/>
</TextBox.Text>

相对资源RelativeSource

RelativeSource={RelativeSource Self}是一个特殊的绑定源,表示指向当前元素自己。自己绑定自己,将ToolTip属性绑定到Validation.Errors中第一个错误项的错误信息(Validation.Errors)[0].ErrorContent。

<Style x:Key="textStyleTextBox" TargetType="{x:Type TextBox}">
<Setter Property="Foreground" Value="#333333" />
<Setter Property="MaxLength" Value="40" />
<Setter Property="Width" Value="392" />
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>

使用转换器和验证规则

<TextBox Name="StartDateEntryForm" Grid.Row="3" Grid.Column="1" Style="{StaticResource textStyleTextBox}" Margin="8,5,0,5" Validation.ErrorTemplate="{StaticResource validationTemplate}">
<TextBox.Text>
<Binding Path="StartDate" UpdateSourceTrigger="PropertyChanged" Converter="{StaticResource dateConverter}">
<Binding.ValidationRules>
<src:FutureDateRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>

//自定义的验证规则须从ValidationRule继承。
class FutureDateRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
DateTime date;
try
{
date = DateTime.Parse(value.ToString());
}
catch (FormatException)
{
return new ValidationResult(false, "Value is not a valid date.");
}
if (DateTime.Now.Date > date)
{
return new ValidationResult(false, "Please enter a date in the future.");
}
else
{
return new ValidationResult(true, null);
}
}
}

使用数据触发器

SpecialFeatures是一个枚举数据类型。

<DataTrigger Binding="{Binding Path=SpecialFeatures}">
<DataTrigger.Value>
<src:SpecialFeatures>Color</src:SpecialFeatures>
</DataTrigger.Value>
<Setter Property="BorderBrush" Value="DodgerBlue" TargetName="border" />
<Setter Property="Foreground" Value="Navy" TargetName="descriptionTitle" />
<Setter Property="Foreground" Value="Navy" TargetName="currentPriceTitle" />
<Setter Property="BorderThickness" Value="3" TargetName="border" />
<Setter Property="Padding" Value="5" TargetName="border" />
</DataTrigger>

    多重绑定

绑定源是多个源,绑定目标与绑定源是一对多的关系。

<ComboBox.IsEnabled>
<MultiBinding Converter="{StaticResource specialFeaturesConverter}">
<Binding Path="CurrentUser.Rating" Source="{x:Static Application.Current}"/>
<Binding Path="CurrentUser.MemberSince" Source="{x:Static Application.Current}"/>
</MultiBinding>
</ComboBox.IsEnabled>
//自定义的转换器须实现IMultiValueConverter接口。
class SpecialFeaturesConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
//数组中的对象数值的索引顺序与XAML文件的多重绑定定义有关。
int rating = (int)values[0];
DateTime date = (DateTime)values[1];

return ((rating >= 10) && (date.Date < (DateTime.Now.Date - new TimeSpan(365, 0, 0, 0))));
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
return new object[2] { Binding.DoNothing, Binding.DoNothing };
}
}

    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;
    }
}

时间: 2024-11-09 03:27:05

WPF中的数据绑定Data Binding使用小结的相关文章

WPF入门教程系列十五——WPF中的数据绑定(一)

使用Windows Presentation Foundation (WPF) 可以很方便的设计出强大的用户界面,同时 WPF提供了数据绑定功能.WPF的数据绑定跟Winform与ASP.NET中的数据绑定功能类似,但也有所不同,在 WPF中以通过后台代码绑定.前台XAML中进行绑定,或者两者组合的方式进行数据绑定.您可以绑定控件.公共属性.XML 或对象,WPF中的数据绑定跟WinForm与ASP.NET相比,更加快捷.灵活和简单. 一.什么是数据绑定 WPF 中的数据绑定,必须要有绑定目标和

WPF中的数据绑定!!!

引用自:https://msdn.microsoft.com/zh-cn/magazine/cc163299.aspx 数据点: WPF 中的数据绑定 数据点 WPF 中的数据绑定 John Papa 代码下载位置: DataPoints2007_12.exe (161 KB) Browse the Code Online   目录 数据绑定细节 创建简单的绑定 绑定模式 绑定的时间 绑定到 XML 对象绑定和 DataTemplates 对数据进行排序 欢迎试用和反馈 到目前为止,很多人都知道

【值转换器】 WPF中Image数据绑定Icon对象

原文:[值转换器] WPF中Image数据绑定Icon对象 ? ? ? ?这是原来的代码: ? ? ? ?<Image Source="{Binding MenuIcon}" ?/> ? ? ? ?这里的MenuIcon是string类型,MenuIcon = "/Image/Tux.ico". ? ? ? ?我遇到的问题是,同事已经封装好的类中的MenuIcon是Icon对象,并不是一个相对或者绝对的路径,另外WPF里也没有可以直接表示Icon对象的控

Windows Presentation Foundation(WPF)中的数据绑定(使用XmlDataProvider作控件绑定)

原文:Windows Presentation Foundation(WPF)中的数据绑定(使用XmlDataProvider作控件绑定) --------------------------------------------------------------------------------引用或转载时请保留以下信息:大可山?[MSN:a3news(AT)hotmail.com] http://www.zpxp.com?http://www.brawdraw.com萝卜鼠在线图形图像处理

WPF QuickStart系列之数据绑定(Data Binding)

这篇博客将展示WPF DataBinding的内容. 首先看一下WPF Data Binding的概览, Binding Source可以是任意的CLR对象,或者XML文件等,Binding Target需要有依赖属性.这样便可以进行Data Binding.请看下面的示例, C# public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); DataContext = new Pe

WPF入门教程系列十八——WPF中的数据绑定(四)

六.排序 如果想以特定的方式对数据进行排序,可以绑定到 CollectionViewSource,而不是直接绑定到 ObjectDataProvider.CollectionViewSource 则会成为数据源,并充当截取 ObjectDataProvider 中的数据的媒介,并提供排序.分组和筛选功能,然后将它传送到目标. 这个显示是使用 CollectionViewSource做为排序的数据源,首先将CollectionViewSource的Source 属性设置为 ObjectDataPr

angularJS 中的two-way data binding.

原文: https://stackoverflow.com/questions/11616636/how-to-do-two-way-filtering-in-angularjs ------------------------------------------------------------------------------------------------------------ It turns out that there's a very elegant solution t

WPF入门教程系列十七——WPF中的数据绑定(三)

四. XML数据绑定 这次我们来学习新的绑定知识,XML数据绑定.XmlDataProvider 用来绑定 XML 数据,该XML数据可以是嵌入.Xmal文件的 XmlDataProvider 标记中,也可以是外部位置引用的文件中. 当然嵌入式 XML 内容必须置于 XmlDataProvider 内部的 <x:XData> 标记中,而且不容易修改,所以建议使用XML数据文件形式.对于 XmlDataProvider 必须命名一个 x:Key 值,以便数据绑定目标可对其进行引用. XmlDat

WP8.1 Study5:Data binding数据绑定

一.数据绑定 最简单的编程UI控件的方法是写自己的数据来获取和设置控件的属性,e.g. , textBox1.Text = "Hello, world"; 但在复杂的应用程序,这样的代码很快就会变得笨拙,容易出错 因此,为了更加方便,使用XAML数据绑定到你的UI链接到一个在应用程序中包含应用程序的数据的类. 这个类class:是一个对于被称为视图模型的数据绑定(ViewModel)的数据源. UI控件可以从视图模型Viewmodel类的属性自动获取其显示值,而且通过改变Viewmod