最近几天高强度开发,暴露出不少问题,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. Cocos 属性常用参数
  2. android 多个url请求,[Android]Retrofit多base_url请求解决方案
  3. java kill信号_kill 命令在Java应用中使用注意事项
  4. CVPR 2019 | 全新缺失图像数据插补框架—CollaGAN
  5. 核弹级漏洞 Apache Log4j2 漏洞详情和修复建议
  6. phpcmsV9 用户vip过期后,自动降级的办法 - 代码篇
  7. 局域网linux唤醒windows,局域网唤醒 (WOL - Wake on LAN) | 远程启动计算机- ManageEngine OpUtils...
  8. 解决keep-live使用之后的问题
  9. mysql openxml_OpenXML SDK2.0初窥
  10. mysql省市联动_sql全国 省市 联动级联
  11. MacOS Mojava密码最小4位,这很讨厌!
  12. 有价值的产品=设计思维+精益创业+敏捷方法
  13. java跑酷游戏_HTML5游戏实战(1):50行代码实现正面跑酷游戏
  14. 将UTC(字符串包含TZ的时间)时间转换成本地时间 python
  15. 《我的青春谁做主》剧中人物星座分析
  16. 软件开发中的瀑布模型
  17. SystemUI之NavigationBar导航栏
  18. 575. Distribute Candies*
  19. 马士兵java ppt_[马士兵JAVA教程课件.ppt
  20. java初始化二维数组的三种方式

热门文章

  1. 自学Python 58 Socket套接字编程 (一)
  2. linux驱动由浅入深系列:高通sensor架构实例分析之三(adsp上报数据详解、校准流程详解)
  3. 共享汽车倒闭大讨债:打砸办公室、围堵创始人...途歌的1500元你退了吗?
  4. C++ 常见设计模式
  5. 桥田亮相AEE汽车工程会议,用实力彰显品牌魅力
  6. Linux快速创建文档 并查看
  7. 推荐一套国外超棒的计算机科学视频课程(不是广告)
  8. 校招+实习 | 旷视研究院职位一览无余!
  9. 看到老何的blog,心里感到很难受
  10. 华清远见——(JAVA高级阶段技术总结)