前言:

数据绑定的基本步骤:

(1)先声明一个类及其属性

(2)初始化类赋值

(3)在C#代码中把控件DataContext=对象;

(4)在界面设计里,控件给要绑定的属性{Binding 绑定类的属性}

原理:监听事件机制,界面改变有TextChanged之类的事件,所以改变界面可以同步修改到对象

想让普通对象实现数据绑定,需要实现INotifyPropertyChanged接口才能监听ProperChanged。具体代码如下显示:

  class Person:INotifyPropertyChanged
{
private int age; public int Age
{
get
{
return age;
}
set
{
this.age = value;
if (PropertyChanged != null)
{
PropertyChanged(this,
new PropertyChangedEventArgs("Age"));
}
}
}
}

  

BindingMode枚举值
名称 说明
OneWay 当源属性变化时更新目标属性
TwoWay 当源属性变化时更新目标属性,当目标属性变化时更新源属性
OneTime 最初根据源属性设置目标属性,其后的改变会忽略。
OneWayToSource 与OneWay类型相似,但方向相反。
Default 此类绑定依赖于目标属性
UpdateSourceTrigger
名称 说明
Default 默认值,与依赖属性有关
Explicit 必须在显示地调用BindingExpression.UpdateSource的情况下才更新源。
LostFocus 控件失去焦点的时候更新源值
PropertyChanged 绑定的目标值改变时更新。

实例运行后界面如下:

MainWindow.xaml

<Window x:Class="WpfApp1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp1"
mc:Ignorable="d"
Title="MainWindow" Height="600" Width="800">
<StackPanel>
<TextBlock Text="Student ID:" FontWeight="Bold" Margin="5"/>
<TextBox Name="textBoxId" Margin="5" Text="{Binding Id,Mode=TwoWay}"/>
<TextBlock Text="Student Name:" FontWeight="Bold" Margin="5"/>
<TextBox Name="textBoxName" Margin="5" Text="{Binding Name,Mode=TwoWay}"/>
<TextBlock Text="Student List:" FontWeight="Bold" Margin="5"/>
<ListBox Name="listBox1" Height="110" Margin="5" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=Id}" Width="30"/>
<TextBlock Text="{Binding Path=Name}" Width="60"/>
<TextBlock Text="{Binding Path=Age}" Width="30"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<ListBox Name="listBox2" Height="80" ItemsSource="{Binding Student}" DisplayMemberPath="Id" Margin="5"/>
<Slider Name="slider1" MinHeight="25" Value="{Binding Id}"/>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"></RowDefinition>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Button Grid.Column="0" Content="Action" FontSize="40" Name="btnCtrl1" Height="80" Margin="5" Click="BtnCtrl1_Click"/>
<Button Grid.Column="1" Content="Action" FontSize="40" Name="btnCtrl2" Height="80" Margin="5" Click="BtnCtrl2_Click"/>
</Grid>
</StackPanel>
</Window>

  

首先解释下C#中的Task.Delay()和Thread.Sleep()

  1. Thread.Sleep()是同步延迟,Task.Delay()是异步延迟。

  2. Thread.Sleep()会阻塞线程,Task.Delay()不会。

  3. Thread.Sleep()不能取消,Task.Delay()可以。

  4. Task.Delay()实质创建一个运行给定时间的任务,Thread.Sleep()使当前线程休眠给定时间。

  5. 反编译Task.Delay(),基本上讲它就是个包裹在任务中的定时器。

  6. Task.Delay()和Thread.Sleep()最大的区别是Task.Delay()旨在异步运行,在同步代码中使用Task.Delay()是没有意义的;在异步代码中使用Thread.Sleep()是一个非常糟糕的主意。通常使用await关键字调用Task.Delay()。

  7. 我的理解:Task.Delay(),async/await和CancellationTokenSource组合起来使用可以实现可控制的异步延迟。

MainWindow.xaml.cs

using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Threading.Tasks;
using System.Windows; namespace WpfApp1
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public ObservableCollection<Student> stuList;
public MainWindow()
{
InitializeComponent();
this.DataContext = new Student() { Name="111", Id =1 };
Task.Run(async() => //开启异步线程task
{
await Task.Delay(3000); //延时3秒
Dispatcher.Invoke((Action)delegate //线程中主界面显示需要用委托,不然这次赋值,在界面不更新
{
this.DataContext = new Student() { Name = "222", Id = 2 };
});
});
this.DataContext = new Student() { Name = "333" , Id = 3 };
} private void BtnCtrl1_Click(object sender, RoutedEventArgs e)
{
Student stu = new Student() { Id = 4, Name = "Jon", Age = 29 }; //实例化一个Student类 并给类成员赋值
this.DataContext = stu;//将实例化得对象传给DataContext
}
private void BtnCtrl2_Click(object sender, RoutedEventArgs e)
{
ObservableCollection<Student> stuList = new ObservableCollection<Student>() //具有通知属性的list
{
new Student() { Id=5, Name="Tim", Age=29 },
new Student() { Id=6, Name="Tom", Age=28 },
};
this.listBox1.ItemsSource = stuList; this.listBox2.ItemsSource = stuList;
this.listBox2.DisplayMemberPath = "Name";
this.DataContext = stuList;
}
}
public class Student : INotifyPropertyChanged //创建一个继承自INotifyPropertyChanged的类Student
{ private string name; public string Name
{
get { return name; }
set
{
name = value;
if (this.PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Name")); //给Name绑定属性变更通知事件
}
}
} private int id; public int Id
{
get { return id; }
set
{
id = value;
if (this.PropertyChanged != null)
{
this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Id"));//给Id绑定属性变更通知事件
}
}
} private int age; public int Age
{
get { return age; }
set
{
age = value;
if (this.PropertyChanged != null)
{
this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Age"));//给Age绑定属性变更通知事件
}
}
} public int ID { get; internal set; } public event PropertyChangedEventHandler PropertyChanged;
}
}

  

想了解更多C#知识,请扫描下方二维码

需加微信交流群的,请加小编微信号z438679770,切记备注 加群,小编将会第一时间邀请你进群!

WPF 数据绑定实例一的更多相关文章

  1. Wpf 数据绑定实例2

    1.简单DataContext绑定 //绑定对象 label.DataContext = Process.GetCurrentProcess(); Xaml代码: <Grid> <G ...

  2. WPF数据绑定Binding(二)

    WPF数据绑定Binding(二) 1.UI控件直接的数据绑定 UI对象间的绑定,也是最基本的形式,通常是将源对象Source的某个属性值绑定 (拷贝) 到目标对象Destination的某个属性上. ...

  3. 剖析WPF数据绑定机制

    引言 WPF框架采取的是MVVM模式,也就是数据驱动UI,UI控件(Controls)被严格地限制在表示层内,不会参与业务逻辑的处理,只是通过数据绑定(Data Binding)简单忠实地表达与之绑定 ...

  4. 微软原文翻译:适用于.Net Core的WPF数据绑定概述

    原文链接,大部分是机器翻译,仅做了小部分修改.英.中文对照,看不懂的看英文. Data binding overview in WPF 2019/09/19 Data binding in Windo ...

  5. C#WPF数据绑定模板化操作四步走

    前言:WPF数据绑定对于WPF应用程序来说尤为重要,本文将讲述使用MVVM模式进行数据绑定的四步走用法: 具体实例代码如下: 以下代码仅供参考,如有问题请在评论区留言,谢谢 1 第一步:声明一个类用来 ...

  6. WPF 数据绑定Binding

    什么是数据绑定? Windows Presentation Foundation (WPF) 数据绑定为应用程序提供了一种简单而一致的方法来显示数据以及与数据交互. 通过数据绑定,您可以对两个不同对象 ...

  7. WPF——数据绑定(一)什么是数据绑定

    注意:本人初学WPF,文中可能有表达或者技术性问题,欢迎指正!谢谢! 一:什么是数据绑定? “Windows Presentation Foundation (WPF) 数据绑定为应用程序提供了一种简 ...

  8. WPF 10天修炼 第十天- WPF数据绑定

    WPF数据绑定 数据绑定到元素属性是将源对象指定为一个WPF元素,并且源属性是一个依赖属性,依赖属性内置了变更通知.当改变源对象依赖属性值之后,绑定目标可以立即得到更新,开发人员不需要手动编写响应事件 ...

  9. WPF开发实例——仿QQ登录界面

    原文:WPF开发实例--仿QQ登录界面 版权声明:本文为博主原创文章,如需转载请标明转载地址 http://blog.csdn.net/u013981858 https://blog.csdn.net ...

随机推荐

  1. [SpringSecurity] UserDetailsService 详解

    UserDetailsService 接口 当什么也没有配置的时候,账号和密码是由 Spring Security 定义生成的. 而在实际项目中账号和密码都是从数据库中查询出来的. 所以我们要通过自定 ...

  2. 详解MySQL事务原理

    老刘是即将找工作的研究生,自学大数据开发,一路走来,感慨颇深,网上大数据的资料良莠不齐,于是想写一份详细的大数据开发指南.这份指南把大数据的[基础知识][框架分析][源码理解]都用自己的话描述出来,让 ...

  3. mac外接键盘HOME,END键问题

    参考: How to Fix the Home and End Buttons for an External Keyboard in Mac mac老用户应该都知道, MAC自带的键盘的 cmd+左 ...

  4. 查看文件MD5值

    Windows 打开命令窗口(Win+R),然后输入cmd ·输入命令certutil -hashfile 文件绝对路径 MD5 Linux MD5算法常常被用来验证网络文件传输的完整性,防止文件被人 ...

  5. codeforces 630K Indivisibility (容斥原理)

    IT City company developing computer games decided to upgrade its way to reward its employees. Now it ...

  6. Codeforces Round #652 (Div. 2) C. RationalLee 贪心

    题意: t组输入,你有n个数,还有k个朋友,每一个朋友需要wi个数.意思就是你要给第i个朋友分配wi个数,输入保证w1+w2+...+wk=n 一个朋友的兴奋值是你分配给他的数中最大值加上最小值的和( ...

  7. CQRS Event Sourcing介绍

    什么是CQRS模式? CQRS是Command and Query Responsibility Segregation的缩写,直译就是命令与查询责任分离的意思. 命令会改变对象的状态,但不返回任何数 ...

  8. Linux ulimit使用

    什么是ulimit? ulimit是一个可以设置或者汇报当前用户资源限制的命令.使用ulimit命令需要有管理员权限,它只能在允许使用shell进行控制的系统中使用.也就是说它已经被嵌入到shell当 ...

  9. CF1459-C. Row GCD

    CF1459-C. Row GCD 题意: 给出两个整数序列\(a.b\),他们的长度分别为\(n,m\).对于数组\(b\)中的每个数字,让你求出\(gcd(a_1+b_j,a_2+b_j,..., ...

  10. springboot(四) rabbitMQ demo

    RabbitMQ 即一个消息队列,主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用. 消息中间件在互联网公司的使用中越来越多,刚才还看到新闻阿里将RocketMQ捐献给了apa ...