最近几天高强度开发,暴露出不少问题,WPF还达不到信手拈来的地步,好些东西还要去看看以前的项目。平时还是要多总结的,层次高了之后关注的知识点才会更深入。下面总结下WPF的绑定相关,总结之前又看了一遍深入浅出WPF,结合平时用到的得出此文(以TextBox为例,覆盖常见的需求,其他控件类似, 代码下载,先看代码再看解释效果更好)。
        本文主要包含以下内容:
        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其实在有数据驱动的思想,具体各位可以自行学习;

至此总结完成,感觉讲的不够透彻,深入理解还需自己研究。希望能对初学者有些帮助,如果有什么错误或想法,还望不吝指教,转载请保留 原文链接。
源码下载

WPF之数据绑定总结相关推荐

  1. 学习WPF: 创建数据绑定目录树

    如果使用了WPF而不使用数据绑定(手工在界面和数据间进行同步),总会感觉不值.但是大部分讨论WPF数据绑定的文章,主题大多集中在ListBox这样平坦的数据集合上,讲如何绑定层次结构数据的比较少,这里 ...

  2. WPF TabControl 数据绑定

    WPF TabControl in Binding's world 首先,TabControl是间接继承自ItemControl的控件,因此可以像ItemControl那样自如的使用. 自此,我们知道 ...

  3. WPF ListView 数据绑定后,ListViewItem如何拥有ContextMenu

    这个需要重写ListView的Style. 首先在ListView的Style对应位置增加一个ContextMenu的声明: <!--ListViewItem的菜单绑定--><Con ...

  4. WPF:数据绑定--PropertyChangeNotification属性更改通知

    PropertyChangeNotification属性更改通知 实现效果: 1.拍卖金额自动随属性值变化而通知界面绑定的值变化. 关键词 : INotifyPropertyChanged Obser ...

  5. WPF:ListView数据绑定及Style

    DrugRecordsWin.xaml <ListView Grid.Row="4" Grid.Column="1" Name="list_Dr ...

  6. Wpf ListBox数据绑定实例1--绑定字典集合

    1.使用ListBox绑定Dictionary字典数据 ListBox常用事件SelectionChanged private void bindListBox() {Dictionary<st ...

  7. WPF数据绑定(1-简单数据绑定)

    2019独角兽企业重金招聘Python工程师标准>>> 附WPF书籍推荐: 1.不要为书籍经销商的炒作蒙蔽,国内翻译的<WPF揭秘>被褒扬成经典,其实我认为该书浅尝则止, ...

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

    使用Windows Presentation Foundation (WPF) 可以很方便的设计出强大的用户界面,同时 WPF提供了数据绑定功能.WPF的数据绑定跟Winform与ASP.NET中的数 ...

  9. 分享Silverlight/WPF/Windows Phone一周学习导读(10月30日-11月6日)

    分享Silverlight/WPF/Windows Phone一周学习导读(10月30日-11月6日) 本周Silverlight学习资源更新 Silverlight 定位 niejunhua [学习 ...

最新文章

  1. PyCharm软件常见配置
  2. python删除重复值所在的行数_使用python读取txt文件的内容,并删除重复的行数方法...
  3. Java | 设计模式-适配器模式
  4. JavaScript数据结构与算法——栈详解
  5. 前端学习(2380):调整目录结构
  6. 前端学习(711):数组导读
  7. Leetcode--75. 颜色分类
  8. delphi chart 曲线实时_发展学生曲线跑能力的体育游戏及运用研究
  9. 使用序列化反序列化实现学生管理系统
  10. 【Flink】Flink on yarn 支持指定 application id 吗? yarn.application.id
  11. Python 爬取 6000 篇文章分析 CSDN 是如何进入微信 500 强的
  12. C/C++ 取整函数
  13. PHP响应式营销型万能H5建站系统源码
  14. HTML 实现打电话
  15. 原生JS制作自动+手动轮播图,附带二级分类菜单
  16. 2021-03-21
  17. word转pdf保持图片清晰度
  18. [2001-2003美/新等合拍经典奇幻大片][魔戒1-3][BD-RMVB][中英字幕/1280x720高清晰版]
  19. 中职计算机对数学知识的要求,中职计算机专业的数学教学研究
  20. 目标检测-twostage

热门文章

  1. 网上商城后台管理系统
  2. Visio 保存卡死解决办法
  3. mysql中的存储过程优点_数据库存储过程在优点
  4. Redis-基础学习
  5. C语言的左值(lvalue)和右值(rvalue)的含义是什么?
  6. 安装IDEA教程详解,小白们,过来看看吧
  7. 《惢客创业日记》2019.06.15(周六) 辣条如何证明诚信?
  8. 如何偷窃局域网其它电脑文件_偷窃工作
  9. 软件开发与测试阶段对照图
  10. EastChilde idea替换快捷键,批量处理对象