WPF之数据绑定总结
来源:互联网 发布:mac cad中文版 编辑:程序博客网 时间:2024/05/16 16:07
最近几天高强度开发,暴露出不少问题,WPF还达不到信手拈来的地步,好些东西还要去看看以前的项目。平时还是要多总结的,层次高了之后关注的知识点才会更深入。下面总结下WPF的绑定相关,总结之前又看了一遍深入浅出WPF,结合平时用到的得出此文(以TextBox为例,覆盖常见的需求,其他控件类似,代码下载,先看代码再看解释效果更好)。
本文主要包含以下内容:
1.TextBox绑定后台的值(一次绑定,类似于赋值);
2.TextBox绑定后台的值(可通过改绑定的值自动更新值);
3.TextBox绑定另一个控件的属性值(随时更新值);
4.TextBox绑定另一个控件的属性值(双向更新);
5.TextBox绑定资源的值;
6.GridView选择一行显示其信息;
7.其他一些注意点
前台将绑定的逻辑固定,后台给数据源,这里后台绑定的源是当前对象,前台获得当前对象的BindData属性值;
TextBox和ComboBox绑定GridView的选择项时,由于GridView的选择项是Object的,文本下拉框无法自动获取其数据,需要自定义转换帮助类,继承自IValueConverter,具体写法如下(SelectItemConverter为例):
7.2触发通知事件时注意在值变化之后触发,也就是_TextBoxData = value;OnPropertyChanged("TextBoxData");不要写倒了,刚开始学习时也遇过,写反了之后会导致第一次改变值没有反应(嘿嘿,其实当时只是依葫芦画瓢,没太理解,才会犯那些错误);
7.3如果要绑定的集合也自动更新可以使用ObservableCollection代替List,前者实现了INotifyPropertyChanged接口,在集合变化时会自动更新界面;
7.4上面的6其实在有数据驱动的思想,具体各位可以自行学习;
本文主要包含以下内容:
1.TextBox绑定后台的值(一次绑定,类似于赋值);
2.TextBox绑定后台的值(可通过改绑定的值自动更新值);
3.TextBox绑定另一个控件的属性值(随时更新值);
4.TextBox绑定另一个控件的属性值(双向更新);
5.TextBox绑定资源的值;
6.GridView选择一行显示其信息;
7.其他一些注意点
1.TextBox绑定后台的值(一次绑定,类似于赋值);
前台设计页面:
<Label>tbDataFirst:</Label><TextBlock Name="tbDataFirst" Width="120" TextAlignment="Center" Text="{Binding BindData}"></TextBlock>后台代码:
private string _BindData = string.Empty;public string BindData{ get { if (_BindData.Length == 0) _BindData = "this is BindData"; return _BindData; } set { _BindData = value; }}初始化时:tbDataFirst.DataContext = this;
前台将绑定的逻辑固定,后台给数据源,这里后台绑定的源是当前对象,前台获得当前对象的BindData属性值;
2.TextBox绑定后台的值(可通过改绑定的值自动更新值);
前台设计页面:<Label>tbDataSecond:</Label><TextBox Name="tbDataSecond" Width="120"></TextBox><Button Click="Button_Click">ChangeTextInfo</Button>后台代码:
private string _TextBoxData = string.Empty;public string TextBoxData{ get { if (_TextBoxData.Length == 0) _TextBoxData = "this is data"; return _TextBoxData; } set { if (_TextBoxData != value) { _TextBoxData = value; OnPropertyChanged("TextBoxData"); } }}public event PropertyChangedEventHandler PropertyChanged;public virtual void OnPropertyChanged(string propertyName){ if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); }}private void Button_Click(object sender, RoutedEventArgs e){ TextBoxData = DateTime.Now.ToString("HH:mm:ss.fff");}绑定时代码:
tbDataSecond.SetBinding(TextBox.TextProperty, new Binding("TextBoxData") { Source = this, Mode = BindingMode.TwoWay });这里要注意跟1的区别是这里能自动更新界面的值,要实现这个功能,则源对象须继承INotifyPropertyChanged接口,同时在属性值改变时触发通知事件,即OnPropertyChanged("TextBoxData")。这样每次TextBoxData属性值变化时界面将会自动更新相应的值;
3.TextBox绑定另一个控件的属性值(随时更新值);
前台设计页面:
<StackPanel Orientation="Horizontal" Margin="5"> <Label>Input String:</Label> <TextBox Name="tbInput" Width="120"></TextBox> <Label>Output String:</Label> <TextBox Name="tbOutpnput" Width="120" Text="{Binding Text, ElementName=tbInput}"></TextBox></StackPanel>这里全部有前端实现,tbOutpnput监控tbInput控件的文本值,tbInput一有变化则tbOutpnput也会跟着变化(但本质是tbInput控件通知tbOutpnput控件的);
4.TextBox绑定另一个控件的属性值(双向更新);
前台设计页面:<StackPanel Orientation="Horizontal" Margin="5"> <Label>TwoWayInput String:</Label> <TextBox Name="tbTwoWayInput" Width="120"></TextBox> <Label>TwoWayOutpnput String:</Label> <TextBox Name="tbTwoWayOutpnput" Width="120" Text="{Binding Text, ElementName=tbTwoWayInput, UpdateSourceTrigger=PropertyChanged}"></TextBox></StackPanel>
这里跟3的区别就在于UpdateSourceTrigger属性值设为PropertyChanged,TextBox控件的默认值是LostFocus;
5.TextBox绑定资源文件的值;
前台设计页面:
<Window.Resources> <sys:String x:Key="TestInfo">Hello World!</sys:String></Window.Resources><StackPanel Orientation="Horizontal" Margin="5"> <Label>Read from resources:</Label> <Label Content="{StaticResource TestInfo}"></Label></StackPanel>注意这里需要在前台页面的Windows命名空间加上xmlns:sys="clr-namespace:System;assembly=mscorlib";
6.GridView选择一行显示其信息;
这里内容主要包括:GridView和ComboBox绑定数据源(第一次加载时绑定)、TextBox和ComboBox绑定GridView的选择项的详细信息;
前台设计页面:
<StackPanel Margin="5"> <ListView x:Name="lvStudent"> <ListView.View> <GridView > <GridViewColumn Header="Name" Width="100" DisplayMemberBinding="{Binding Name}"></GridViewColumn> <GridViewColumn Header="Level" Width="100" DisplayMemberBinding="{Binding Level.LevelInfo}"> </GridViewColumn> </GridView> </ListView.View> </ListView></StackPanel><StackPanel Orientation="Horizontal" Margin="5"> <Label>Name:</Label> <TextBox Name="tbName" Width="120" Text="{Binding Path=SelectedItem, ElementName=lvStudent, Converter={StaticResource ItemToName}}"></TextBox> </StackPanel><StackPanel Orientation="Horizontal" Margin="5"> <Label>LevelInfo</Label> <ComboBox Name="cbLevel" AllowDrop="False" Width="180" SelectedIndex="{Binding Path=SelectedItem,ElementName=lvStudent, Converter={StaticResource ItemToIndex}}"></ComboBox></StackPanel>
绑定数据源:
private void InitDataSource(){ lvStudent.ItemsSource = DataProvider.StudentList; cbLevel.ItemsSource = DataProvider.LevelList; cbLevel.DisplayMemberPath = "LevelInfo";}注意这里ComboBox绑定时要设置DisplayMemberPath值;
TextBox和ComboBox绑定GridView的选择项时,由于GridView的选择项是Object的,文本下拉框无法自动获取其数据,需要自定义转换帮助类,继承自IValueConverter,具体写法如下(SelectItemConverter为例):
[ValueConversion(typeof(object), typeof(string))]public class SelectItemConverter : IValueConverter{ public object Convert(object value, Type t, object para, CultureInfo culture) { Student data = value as Student; return data != null ? data.Name : string.Empty; } public object ConvertBack(object value, Type t, object para, CultureInfo culture) { return null; }}这里是将选择的项先转换成Student对象然后获取其Name属性数据,注意设置ValueConversion特性,前台页面相应的引入命名空间以及标记转换类(详细请对照源码);
7.其他一些注意点
7.1前台和后台重复绑定时以后一次的绑定为主(刚开始开始学习时看有的人前台后台都要绑一遍,后来才知道那是重复的);7.2触发通知事件时注意在值变化之后触发,也就是_TextBoxData = value;OnPropertyChanged("TextBoxData");不要写倒了,刚开始学习时也遇过,写反了之后会导致第一次改变值没有反应(嘿嘿,其实当时只是依葫芦画瓢,没太理解,才会犯那些错误);
7.3如果要绑定的集合也自动更新可以使用ObservableCollection代替List,前者实现了INotifyPropertyChanged接口,在集合变化时会自动更新界面;
7.4上面的6其实在有数据驱动的思想,具体各位可以自行学习;
至此总结完成,感觉讲的不够透彻,深入理解还需自己研究。希望能对初学者有些帮助,如果有什么错误或想法,还望不吝指教,转载请保留原文链接。
源码下载
3 0
- WPF之数据绑定总结
- WPF之数据绑定总结
- WPF之数据绑定
- WPF之数据绑定
- WPF之绑定数据
- WPF之数据绑定
- WPF精粹之数据绑定
- WPF学习之数据绑定
- WPF之经典数据绑定
- WPF学习之数据绑定
- WPF学习之数据绑定
- WPF学习之数据绑定
- WPF学习之数据绑定
- WPF学习之数据绑定
- Wpf基础之数据绑定
- WPF学习之数据绑定
- WPF学习笔记之-WPF数据绑定
- WPF数据绑定之数据模板
- 线程存储
- 网络模型
- Knapsack problem poj 3264
- 树(2)--二叉树的遍历(非递归)+线索二叉树
- 贪心与标记
- WPF之数据绑定总结
- SSH下载方法实现
- 学习bash shell 3
- UVa 10014 简单的计算
- UITableView的基本使用二(性能优化)
- 基础加强____【Java类加载器 & "委托机制"】
- 小P的故事——神奇的Dota
- 快速排序的层次改进
- 高手速成android开源项目【developer篇】