元素绑定

数据绑定最简单的形式是,源对象是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. JS和JQuery概括

    1. BOM 1. location相关 1. location.href 2. location.href="http://www.sogo.com" 3. location.r ...

  2. SDOI2019 R2退役记

    还是退役了呀 Day -1 早上loli发了套题结果啥都不会 之后胡爷爷就秒了道数据结构 不过也没什么人做,于是全机房都在愉快的划水 下午来机房打了场luogu的\(rated\)赛,还是啥都不会 之 ...

  3. NoSQL与关系数据库的比较

  4. Leetcode515. Find Largest Value in Each Tree Row在每个树行中找最大值

    您需要在二叉树的每一行中找到最大的值. 示例: 输入: 1 / \ 3 2 / \ \ 5 3 9 输出: [1, 3, 9] class Solution { public: vector<i ...

  5. [转]C# 中的委托和事件 + 观察者模式

    引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...

  6. 长按触发(PC端和移动端)

    $.fn.longPress = function(fn) { var timeout = undefined; var $this = this; for(var i = 0;i<$this. ...

  7. ALS算法实现用户音乐打分预测

    很多人在决定是否看一部电影之前都会去豆瓣看下评分作为参考,看完电影也会给一个自己的分数.每个人对每个商品或者电影或是音乐都有一个心理的分数,这个分数标明用户是否对这个内容满意.作为内容的提供方,如果可 ...

  8. JavaSE_09_Map

    1.1 概述 Collection中的集合,元素是孤立存在的,向集合中存储元素采用一个个元素的方式存储. Map中的集合,元素是成对存在的(Key---Value).每个元素由键与值两部分组成,通过键 ...

  9. [转]模块化——Common规范及Node模块实现(二)

    模块的循环加载 如果发生模块的循环加载,即A加载B,B又加载A,则B将加载A的不完整版本. // a.js exports.x = 'a1'; console.log('a.js ', require ...

  10. ACM常用的Java代码

    import java.util.*; import java.io.*; public class Main { public static void main(String[] args) thr ...