属性通知之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 ...
随机推荐
- 【MySQL】查看MySQL配置文件路径及相关配置
(1)关于配置文件路径 有时候,我发现虽然尝试修改了配置文件的一些变量,但是并没有生效.后来才发现原来是因为修改的文件并非MySQL服务器读取的配置文件. 如果不清楚MySQL当前使用的配置文件路径, ...
- [转]Torch是什么?
Torch是一个广泛支持机器学习算法的科学计算框架.易于使用且高效,主要得益于一个简单的和快速的脚本语言LuaJIT,和底层的C / CUDA实现:Torch | Github 核心特征的总结:1. ...
- 转载sublime text注册码
直接输入注册码就可以了 ----- BEGIN LICENSE ----- Andrew Weber Single User License EA7E-855605 813A03DD 5E4AD9E6 ...
- Compactness问题
今天偶然在论坛讨论在halcon下紧密度的问题,现在总结一下 Calculation: If L is the length of the contour (see contlength) and F ...
- 递归模式学习(recursion)
所谓递归,就是方法调用自身.对于递归模式来说,要有一个出口来让递归结束,避免出现死循环. 实例全排列: 从n中拿出m个元素进行排列,当n==m时为全排列. 利用递归就是:把n个元素轮流放入第一个位置, ...
- 那些不被关注但很重要的html标签
1.meta标签: <meta> 元素可提供有关页面的元信息(meta-information),比如针对搜索引擎和更新频度的描述和关键词. <meta> 标签位于文档的头部, ...
- SQL Server中行列转换
典型实例 一.行转列 1.建立表格 ifobject_id('tb')isnotnulldroptabletb go createtabletb(姓名varchar(10),课程varchar(10) ...
- UI:UITableView 编辑、cell重用机制
tableView编辑.tableView移动.UITableViewController tableView的编辑:cell的添加.删除. 使⽤场景: 删除⼀个下载好的视频,删除联系⼈: 插⼊⼀条新 ...
- 为什么要把js代码写到<!--//-->中
是为了兼容,不支持js的浏览器会把其中的内容当做html注释.
- 详解MyEclipse10 安装Spket 1.6.23(支持Extjs4.1.1及jQuery1.8)
用MyEclipse10安装Spket主要有3种方式:在线下载更新.下载Zip覆盖.下载jar包安装.我用在线安装尝试了N次终于还是失败,只好下载jar包来安装,在失败了M次之后终于安装成功,现在网上 ...