属性通知之INotifyPropertyChanged
为什么后台绑定的值改变了前台不发生变化了?
针对这个初学者很容易弄错的问题,这里介绍一下INotifyPropertyChanged的用法
INotifyPropertyChanged:用于绑定属性更新
/// <summary>
/// 实体基类,实现了属性通知
/// </summary>
public class BaseEntity : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged; /// <summary>
/// 触发属性通知
/// 这里用了一个特性的小技巧,就是CallMemberName
/// 通过反射来获取调用者的名称,从而避免每一次调用方法都需要将属性名称传入方法
/// </summary>
/// <param name="propertyName"></param>
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
学生类继承自实体基类,通过继承的OnPropertyChanged方法来通知属性已经发生改变
/// <summary>
/// 学生类
/// </summary>
public class Student : BaseEntity
{
private string _name; /// <summary>
/// 名字
/// </summary>
public string Name
{
get { return _name; }
set
{
_name = value;
OnPropertyChanged();
}
} private int _age; /// <summary>
/// 年龄
/// </summary>
public int Age
{
get { return _age; }
set
{
_age = value;
OnPropertyChanged();
}
} private double _score; /// <summary>
/// 分数
/// </summary>
public double Score
{
get { return _score; }
set
{
_score = value;
OnPropertyChanged();
}
}
}
在ViewModel中声明一个Student,并且生成相应事件
public class MainWindowViewModel
{
public Student LiLei { get; set; } public MainWindowViewModel()
{
InitStudentInfo();
StartUpdateScore();
} //初始化学生信息
private void InitStudentInfo()
{
LiLei = new Student
{
Name = "李雷",
Age = ,
Score = 91.5
};
} //开始更新分数
private void StartUpdateScore()
{
//定义一个定时器,改变分数值,若小于100分,那么增加,否则将到达一个特定分数
var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds() };
timer.Tick += (sender, e) =>
{
if (LiLei.Score < )
{
LiLei.Score++;
}
else
{
LiLei.Score = 89.5;
}
};
timer.Start();
}
}
前台Xaml
<Grid>
<StackPanel>
<TextBlock>
<Run Text="姓名:"/>
<Run Text="{Binding LiLei.Name}"/>
</TextBlock>
<TextBlock>
<Run Text="年龄:"/>
<Run Text="{Binding LiLei.Age}"/>
</TextBlock>
<TextBlock>
<Run Text="分数:"/>
<Run Text="{Binding LiLei.Score}"/>
</TextBlock>
</StackPanel>
</Grid>
后台绑定
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainWindowViewModel();
}
效果图:
一个简单是示意例子,其实在大部分的Mvvm框架中,都有一些类是实现了属性通知的,会有相应的方法可以调用,一般不用自己去实现INotifyPropertyChanged接口
属性通知之INotifyPropertyChanged的更多相关文章
- wpf 属性变更通知接口 INotifyPropertyChanged
在wpf中将控件绑定到对象的属性时, 当对象的属性发生改变时必须通知控件作出相应的改变, 所以此对象需要实现 INotifyPropertyChanged 接口 例: //实现属性变更通知接口 INo ...
- 属性通知之ObservableCollection
单个属性是如何去通知,在上一章已经介绍过了,那么集合如何做到属性通知呢?这里要介绍ObservableCollection<T>,字面意思就是用于观察的集合. msdn上给出的定义是:表示 ...
- WPF PropertyChanged实现子属性通知
今天用WPF的View绑定了ViewModel的一个属性类,结果在属性类的子属性修改时,没有通知到UI. 如有要显示一个学生信息,采用WPF MVVM的模式,则前端代码 <StackPanel& ...
- 属性更改通知(INotifyPropertyChanged)——针对ObservableCollection
问题 在开发webform中,wpf中的ObservableCollection<T>,MSDN中说,在添加项,移除项时此集合通知控件,我们知道对一个集合的操作是CURD但是恰恰没有Upd ...
- Android之Bean属性通知类
调用: import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import android. ...
- INotifyPropertyChanged 接口 CallerMemberName属性
调用方信息 使用调用方信息属性,可以获取关于调用方的信息传递给方法. 可以获取源代码.行号在源代码和调用方的成员名称的文件路径. 此信息用于跟踪,调试和创建诊断工具非常有用.若要获取此信息,则使用适用 ...
- 【WPF学习笔记】之WPF基础:依赖关系属性和通知
这些天来,对象似乎已经忙得晕头转向了.每个人都希望它们做这做那.Windows® Presentation Foundation (WPF) 应用程序中的典型对象会接到各种各样不同的请求:有要求绑定到 ...
- Fody,告别烦人的INotifyPropertyChanged,最简方式实现通知!
INotifyPropertyChanged 我不是针对谁,我是说在座的各位 相信所有学wpf的,都写过类似下面的代码: 实现INotifyPropertyChanged public class M ...
- 如何优雅的实现INotifyPropertyChanged接口
INotifyPropertyChanged接口在WPF或WinFrom程序中使用还是经常用到,常用于通知界面属性变更.标准写法如下: class NotifyObject : INotifyProp ...
随机推荐
- Apache Spark的部署环境的小记
Spark的单机版便于测试,同时通过SSH用Spark的内置部署脚本搭建Spark集群,使用Mesos.Yarn或者Chef来部署Spark.对于Spark在云环境中的部署,比如在EC2(基本环境和E ...
- Docker 入门教程(转)
add by zhj: 可以简单的认为docker是对LXC(Linux Container)封装,它提供一种比LXC高级的API.Docker使用Go语言开发,利用了Linux提供的LXC,AUFS ...
- 关于Ext.NET Demo程序在IIS7.5部署出现"Ext未定义"的解决方案
有以下三点 1.应用程序池请用ASP.NET4.0经典模式 2.安装ASP.NET 控制面板-->程序和功能-->打开或关闭WIndows功能-->Internet信息服务--& ...
- 各种less开发工具
less是前端开发CSS的神器,但如何让less代码语法高亮,智能提示,快速编译及格式化,这不是一般的IDE的less插件能做到.下面是我搜刮到的一些工具 Codekit - incident57又一 ...
- esp8266烧写机智云固件方法
转:http://blog.csdn.net/k7arm/article/details/51925941 =====================以下为我转载的文章================ ...
- JS鼠标滚动事件
-----------------------------//鼠标滚动事件以下是JS临听鼠标滚动事件 并且还考虑到了各浏览器的兼容----------------------------------- ...
- jquery自定义方法
总结: * jQuery中添加自定义或函数方法1,如 $.fn.extend({'aa':function(){}}) 或 jQuery.fn.aa=function(){}, 这种调用时就得这样,$ ...
- 当spring 容器初始化完成后执行某个方法 防止onApplicationEvent方法被执行两次
在做web项目开发中,尤其是企业级应用开发的时候,往往会在工程启动的时候做许多的前置检查. 比如检查是否使用了我们组禁止使用的Mysql的group_concat函数,如果使用了项目就不能启动,并指出 ...
- Firefox 32 支持 Public Key Pinning 对抗中间人攻击。
Firefox 32 支持 Public Key Pinning 对抗中间人攻击.8月28日消息,即将发布的Firefox 32将支持Public Key Pinning机制,以防止中间人攻击.Pub ...
- JS瀑布流布局模式(2)
这个例子与上一篇类似,唯一的区别是排序的方式有差别.上一篇是在高度最小的列里插入内容,这个案例是按顺序放置内容. 两种方法各有优缺点.第一种需要在图片内容加载完成的情况下有效,各个列的图高度差异不大. ...