为什么后台绑定的值改变了前台不发生变化了?

针对这个初学者很容易弄错的问题,这里介绍一下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的更多相关文章

  1. wpf 属性变更通知接口 INotifyPropertyChanged

    在wpf中将控件绑定到对象的属性时, 当对象的属性发生改变时必须通知控件作出相应的改变, 所以此对象需要实现 INotifyPropertyChanged 接口 例: //实现属性变更通知接口 INo ...

  2. 属性通知之ObservableCollection

    单个属性是如何去通知,在上一章已经介绍过了,那么集合如何做到属性通知呢?这里要介绍ObservableCollection<T>,字面意思就是用于观察的集合. msdn上给出的定义是:表示 ...

  3. WPF PropertyChanged实现子属性通知

    今天用WPF的View绑定了ViewModel的一个属性类,结果在属性类的子属性修改时,没有通知到UI. 如有要显示一个学生信息,采用WPF MVVM的模式,则前端代码 <StackPanel& ...

  4. 属性更改通知(INotifyPropertyChanged)——针对ObservableCollection

    问题 在开发webform中,wpf中的ObservableCollection<T>,MSDN中说,在添加项,移除项时此集合通知控件,我们知道对一个集合的操作是CURD但是恰恰没有Upd ...

  5. Android之Bean属性通知类

    调用: import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import android. ...

  6. INotifyPropertyChanged 接口 CallerMemberName属性

    调用方信息 使用调用方信息属性,可以获取关于调用方的信息传递给方法. 可以获取源代码.行号在源代码和调用方的成员名称的文件路径. 此信息用于跟踪,调试和创建诊断工具非常有用.若要获取此信息,则使用适用 ...

  7. 【WPF学习笔记】之WPF基础:依赖关系属性和通知

    这些天来,对象似乎已经忙得晕头转向了.每个人都希望它们做这做那.Windows® Presentation Foundation (WPF) 应用程序中的典型对象会接到各种各样不同的请求:有要求绑定到 ...

  8. Fody,告别烦人的INotifyPropertyChanged,最简方式实现通知!

    INotifyPropertyChanged 我不是针对谁,我是说在座的各位 相信所有学wpf的,都写过类似下面的代码: 实现INotifyPropertyChanged public class M ...

  9. 如何优雅的实现INotifyPropertyChanged接口

    INotifyPropertyChanged接口在WPF或WinFrom程序中使用还是经常用到,常用于通知界面属性变更.标准写法如下: class NotifyObject : INotifyProp ...

随机推荐

  1. bpl

    RegisterClass LoadPackage Getprocaddress FindClass UnRegisterModuleClasses UnloadPackage

  2. 使用sem_post信号量进行线程同步

    写了一小段程序,测试一下线程同步的问题,如下: #include <stdio.h> #include <string.h> #include <semaphore.h& ...

  3. HDU 5867 Water problem (模拟)

    Water problem 题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5867 Description If the numbers ...

  4. 应用c#读取带cookie的http数据

    @(编程) private static string Login() { string url = string.Format("{0}/login-submit.html?identit ...

  5. 【下有对策】verycd没有的资源有很多方法下载

    由于国内专门从事假冒电驴官方欺骗中国人的verycd公司出品的冒牌官方电驴"阉割驴"目前已经阉割掉了搜索功能,请电驴爱好者们尽快更换正宗版电驴软件: 电骡--emule官方网站:h ...

  6. Python字典 (dictionary)

    字典dict,是Python唯一的标准mapping类型,也是内置在Python解释器中的. mapping object把一个可哈希的值(hashable value)映射到一个任意的object上 ...

  7. 找不到类型或命名空间 datarowview

    在绑定数据时经常会用到这个句程序:<%# DataBinder.Eval(Container.DataItem,"xxxx")%>或者<%# DataBinder ...

  8. C#扫描仪编程、条形码识别编程资料

    扫描仪编程资料:http://www.cnblogs.com/wubh/archive/2011/11/07/2239178.html 图片条形码识别资料:http://www.codeproject ...

  9. 理解MFC 文档、视图、框架[转]

    理解文档/视图框架                                      出处.雷神 了解文档和视图的相互作用关系是编写MFC程序的基本功.但是MFC的应用程序框架把文档和视图之间 ...

  10. Linux 网络编程 高级套接字

    一.套接字选项: 有以下3中方式可以对套接字选项进行设置: getsockopt 和 setsockopt 函数 fcntl函数 ioctl函数 getsockopt和setsockopt函数用于获得 ...