WPF绑定之索引器值变化通知
背景
在某些应用中,需要在界面上绑定到索引器,并在值发生变化时实时更新。
解决方案
只要将包含索引器的类实现INotifyPropertyChanged接口,并在索引值更改时引发PropertyChanged事件,并将属性名称设置为Item[]即可。示例代码如下:
public class NotifyDictionary : INotifyPropertyChanged
{
private readonly Dictionary<string, string> _dictionary = new Dictionary<string, string>(); public string this[string index]
{
get
{
if (_dictionary.ContainsKey(index))
{
return _dictionary[index];
} return string.Empty;
}
set
{
string oldValue = string.Empty;
if (_dictionary.ContainsKey(index))
{
oldValue = _dictionary[index];
} _dictionary[index] = value; if (oldValue != value)
{
OnPropertyChanged(Binding.IndexerName);
}
}
} #region INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
} #endregion INotifyPropertyChanged }
在 代码中,Binding.IndexerName是一个常量,值即为Item[]。
原理
本质上,索引器也是属性,即有参属性。
在WPF的绑定系统中,会监听属性更改事件,如果变化的属性名称为Item[]而且绑定的是索引器,则会更新界面值。可以看出,这个过程与索引器实际名称无关系。所以,即使是在索引器上使用IndexerNameAttribute显式更改索引器名称也不影响整个过程。
无参属性绑定冷知识
在WPF绑定系统中,会监听属性更改事件。但是如果绑定的属性为无参属性(即正常属性,非索引器),其与变化的属性名称比较是不区分大小写的。所以在下面的代码中
private string _name; public string Name
{
get { return this._name; }
set
{
if (_name != value)
{
_name = value;
this.OnPropertyChanged("naMe");
}
}
}
name、Name、naMe、naME效果是一样的。
代码下载
WPF绑定之索引器值变化通知的更多相关文章
- c#索引器的简单用法
abstract class Bird { protected string name; public abstract string Name { get; set; } public abstra ...
- WPFS数据绑定(要是后台类对象的属性值发生改变,通知在“client界面与之绑定的控件值”也发生改变须要实现INotitypropertyChanged接口)
WPFS数据绑定(要是后台类对象的属性值发生改变,通知在"client界面与之绑定的控件值"也发生改变须要实现INotitypropertyChanged接口) MainWindo ...
- WPF实现多值绑定特性以及多值转换
WPF中的实现 我们首先来看一下常规的绑定 <Window x:Class="WpfApplicationSample.MainWindow" xmlns=&qu ...
- WPF快速入门系列(4)——深入解析WPF绑定
一.引言 WPF绑定使得原本需要多行代码实现的功能,现在只需要简单的XAML代码就可以完成之前多行后台代码实现的功能.WPF绑定可以理解为一种关系,该关系告诉WPF从一个源对象提取一些信息,并将这些信 ...
- WPF 绑定
WPF里分三种Binding:Binding, PriorityBinding, MultiBinding,这三种Binding的基类都是BindingBase,而BindingBase又继承于Mar ...
- 【转】【WPF】WPF绑定用法
一.简介 为了后面行文顺利,在进入正文之前,我们首先对本文所涉及到的绑定知识进行简单地介绍.该节包含绑定的基本组成以及构建方式. WPF中的绑定完成了绑定源和绑定目标的联动.一个绑定常常由四部分组成: ...
- WPF - 绑定及惯用法(一)
写在前面:这仍然是一些没有经过严格审阅的文字.虽然我的确执行了初稿.复稿以及审阅等一系列用以保证文章质量的方法,但是仍然担心其中是否有错误.希望您能帮助指出,以在下一次我在版本更新时进行修正.所有的错 ...
- C#基础回顾(三)—索引器、委托、反射
一.前言 ------人生路 ...
- 【WPF】Combobox指定选中值用selectedValue不是很灵的时候,
wpf combobox 指定选中的值,前题,combobox是通过数据库绑定的ItemsSource:所以再指定的时候用selectValue不是很成功!我的解决方法是 生成一个字典,办值和索引对应 ...
随机推荐
- 企业项目开发--分布式缓存memcached(3)
此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 3.3.ssmm0-data 结构: 3.3.1.pom.xml 1 <?xml version=& ...
- 网易云安全DDoS高防全新上线 ,游戏防护实力领先
本文由 网易云发布. 10月24日,网易云安全(易盾)正式上线DDoS高防解决方案[点击查看].基于网易20年网络安全防护经验,网易云安全(易盾)DDoS高防可提供1T超大防护带宽,拥有 ...
- iOS 卡顿
1 使用 dispatch_async,也可能会出现卡顿. 由于mac系统允许overcommit,而iOS系统不允许overcommit 故要控制GCD队列的数量并且最好设置target queue ...
- Golang channel 的基本使用方法
package main import ( "fmt" "learner/Add" "time" ) //a. 普通类型,普通变量保存的就是 ...
- Python os.walk() 遍历出当前目录下的文件夹和文件
os.walk目录遍历 os.walk的参数如下: os.walk(top, topdown=True, onerror=None, followlinks=False) 其中: - top是要遍历的 ...
- (进阶篇)PHP(thinkphp5框架)实现用户注册后邮箱验证,激活帐号
本文将结合实例,讲解如何使用thinkphp5+Mysql完成注册帐号.发送激活邮件.验证激活帐号.处理URL链接过期的功能. 业务流程 1.用户提交注册信息. 2.写入数据库,此时帐号状态未激活. ...
- java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext
spring的项目中有时候会报错:java.lang.IllegalStateException: BeanFactory not initialized or already closed - ca ...
- POJ 1160
#include <iostream> #define MAXN 305 #define inf 123456789 using namespace std; int _m[MAXN][M ...
- POJ 1129
#include<iostream> #include<stdio.h> #include<string> #define MAXN 60 using namesp ...
- vue 中使用 screenfull.js 全屏插件
参考网址: https://blog.csdn.net/houyibing930920/article/details/89214200 https://www.jianshu.com/p/cfbb1 ...