元素绑定

数据绑定最简单的形式是,源对象是WPF元素而且源属性是依赖属性。依赖项属性具有内置的更改通知支持,当在源对象中改变依赖项属性的值时,会立即更新目标对相中的绑定属性。

<!--Xaml程序 -->
<Grid>
<StackPanel>
<Button x:Name="btn" Margin="20" Click="btn_Click" Width="40" Height="35"/>
<TextBox Text="{BindingElementName=txt2,Path=Text,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
<!-- TextBox绑定属性名为txt2,绑定其Text,双向绑定,属性改变时更新 -->
<TextBlock x:Name="txt2" />
</StackPanel>
</Grid>
//后台程序

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
} private void btn_Click(object sender, RoutedEventArgs e)
{
txt2.Text += "k";
}
}
BindingMode枚举值
名称 说明
OneWay 当源属性变化时更新目标属性
TwoWay 当源属性变化时更新目标属性,当目标属性变化时更新源属性
OneTime 最初根据源属性设置目标属性,其后的改变会忽略。
OneWayToSource 与OneWay类型相似,但方向相反。
Default 此类绑定依赖于目标属性
UpdateSourceTrigger
名称 说明
Default 默认值,与依赖属性有关
Explicit 必须在显示地调用BindingExpression.UpdateSource的情况下才更新源。
LostFocus 控件失去焦点的时候更新源值
PropertyChanged 绑定的目标值改变时更新。
数据绑定
<!-- Xaml程序 -->
<Grid>
<StackPanel>
<DataGrid ItemsSource="{Binding PerList}" IsReadOnly="True"></DataGrid>
<ComboBox x:Name="com" ItemsSource="{Binding PerList}" DisplayMemberPath="Name" Margin="10" Width="80" Height="30"/>
<!--绑定PerList,展示其Name属性 -->
</StackPanel>
</Grid>
//后台程序
public partial class MainWindow : Window
{
public List<string> LT { get; set; }
List<Person> Perss { get; set; } public MainWindow()
{
PersonList perlist = new PersonList(); //创建一个PersonList对象
Perss = new List<Person>() { new Person("Getsu1","男"), new Person("Getsu2", "男"), new Person("Getsu3", "男")};
perlist.PerList = Perss; //给PerList属性赋值
this.DataContext = perlist; //将perlist加入上下文,设置之后绑定才会有效
}
} public class PersonList
{
public List<Person> PerList { get; set; }
public PersonList()
{
PerList = new List<Person>();
}
public class Person
{
private string _name;
private string _sex;
public string Name
{
get { return _name; }
set{ _name = value; }
}
public string Sex
{
get { return _sex; }
set{ _sex = value; }
}
public Person(string name, string sex)
{
Name = name;
Sex = sex;
}
}
}
INotifyPropertyChanged

属性更改通知接口。向客户端发出某一属性已更改的通知。
event PropertyChangedEventHandler PropertyChanged;
PropertyChanged 在属性改变时发生。

<!-- X -->
<StackPanel>
<TextBox Text="{Binding Name,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></TextBox>
<TextBox Text="{Binding Sex,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"></TextBox> <TextBlock Text="{Binding Name,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
<!-- 不会随着TextBox内容的改变而改变-->
<TextBlock Text="{Binding Sex,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
<!-- 会随着TextBox内容的改变而改变-->
</StackPanel>
//后台程序
public partial class MainWindow : Window
{
public MainWindow()
{
Person per = new Person("kakarot", "Male");
this.DataContext = per;
InitializeComponent();
}
} public class Person : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string _name;
private string _sex; public string Name
{
get { return _name; }
set
{
_name = value;
//NotifyPropertyChanged("Name");
}
} public string Sex
{
get { return _sex; }
set
{
_sex = value;
NotifyPropertyChanged("Sex");
}
}
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public Person(string name, string sex)
{
Name = name;
Sex = sex;
}
}
特性
public string Sex
{
get { return _sex; }
set
{
_sex = value;
NotifyPropertyChanged();
//使用特性之后可以自动获取属性名
}
}
//特性的表示
private void NotifyPropertyChanged([CallerMemberName]String info="默认值")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}

作者:GetsuKami
链接:https://www.jianshu.com/p/fc644333a9e5
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

WPF数据绑定详解的更多相关文章

  1. AngularJS语法基础及数据绑定——详解各种数据绑定指令、属性应用

    AngularJS简单易学,但是功能强大.特别是在构建单页面应用方面效果显著.而 数据绑定 可以说是他被广泛使用的最主要的优点.他舍弃了对DOM的操作方式,一切都由AngularJS来自动更新视图,我 ...

  2. WPF DrawingVisual详解

    在WPF中,如果需要绘制大量图形元素,并且对性能要求严苛的话,最好使用DrawingVisual,当然,你也可以选用 Path类和比Path类更轻量级的Geometry(几何形状)来实现你的需求,但是 ...

  3. [Aaronyang] 写给自己的WPF4.5 笔记7[三巴掌-ItemsControl数据绑定详解与binding二次处理 3/3]

    我要做回自己--Aaronyang的博客(www.ayjs.net) 博客摘要: 全方位的讲解了转换器的使用,单值,多值转换器,条件转换器,StringFormat等方式 详细的实践地讲解了Items ...

  4. SpringMVC类型转换、数据绑定详解[附带源码分析]

    目录 前言 属性编辑器介绍 重要接口和类介绍 部分类和接口测试 源码分析 编写自定义的属性编辑器 总结 参考资料 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那 ...

  5. AngularJS开发指南12:AngularJS的模板,CSS,数据绑定详解

    模板 AngularJS模板是一种声明式的规则.它包含了模型和控制器的信息,最后会被渲染成用户在浏览器中看到的视图.它是静态的DOM,包含HTML,CSS和AngularJS指定的元素和属性.Angu ...

  6. SpringMVC类型转换、数据绑定详解

    public String method(Integer num, Date birth) { ... } Http请求传递的数据都是字符串String类型的,上面这个方法在Controller中定义 ...

  7. vue中的双向数据绑定详解

    前言 什么是数据双向绑定? vue是一个mvvm框架,即数据双向绑定,即当数据发生变化的时候,视图也就发生变化,当视图发生变化的时候,数据也会跟着同步变化.这也算是vue的精髓之处了.值得注意的是,我 ...

  8. jquery.tmpl.min.js--前端实现模版--数据绑定--详解

    动态请求数据来更新页面是现在非常常用的方法,比如博客评论的分页动态加载,微博的滚动加载和定时请求加载等. 这些情况下,动态请求返回的数据一般不是已拼好的 HTML 就是 JSON 或 XML,总之不在 ...

  9. WPFの触发器详解

    例子1 简单触发器Triggers——满足简答的条件,触发 <Window x:Class="Styles.SimpleTriggers" xmlns="http: ...

随机推荐

  1. 搞了一宿,弄完了一个POP3协议

    POP3协议和SMTP协议都会了,加上PE文件的读写,APIHOOK,以及远程进程注入,我是不是就可以写个简单点的通过邮件传播的蠕虫病毒了,哈哈哈哈哈哈. 感觉POP3协议挺简单的,比那个该死的SMT ...

  2. VS2005进行WORD文档开发

    折腾了将近一个月的WORD文档开发终于告一段落.这件事已经很多大牛已经做过了.并且很多方法都已经非常详细,提供的资料也非常齐全.不过由于时间的久远并且较为散乱.所以我在学习时间过程中还是走了一些些弯路 ...

  3. Js获取或计算时间的相关操作

    //获取当前日期(年月日),如:2017-12-18 function getNowDate() { var dd = new Date(); var y = dd.getFullYear(); // ...

  4. C语言复制数组

    直接上代码,分别是栈上开辟内存,堆上开辟内存 #include <stdio.h> #include <stdlib.h> void test01(){ ]; printf(& ...

  5. LUOGU P3178 [HAOI2015]树上操作

    传送门 解题思路 树链剖分裸题,线段树维护. 代码 #include<iostream> #include<cstdio> #include<cstring> #d ...

  6. 掌握ES6/ES2015核心内容

    ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015. 也就是说,ES6就是ES2015. ...

  7. btree b+tree 的关系

    btree: 平衡二叉树 b+tree:平衡和二叉树的变种,只在叶节点存储数据. mysql 索引使用的数据结构是 b+tree.

  8. Ajax的简单基础

    什么是 AJAX ? AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新. 这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行 ...

  9. 爬虫(四)Selenium + Headless Chrome爬取Bing图片搜索结果

    Bing图片搜索结果是动态加载的,如果我们直接用requests去访问页面爬取数据,那我们只能拿到很少的图片.所以我们使用Selenium + Headless Chrome来爬取搜索结果.在开始前, ...

  10. Python学习之for循环--输出1-100中的偶数和登录身份认证

    输出1-100中的偶数 效果图: 实现代码: for i in range(2,101,2): print(i,end = '\t') if(i == 34): print('\n') if (i = ...