PropertyChangedCallback 只触发了一次?
在自定义的用户控件中,添加一个依赖属性,如下:
public static readonly DependencyProperty ItemsSourceProperty =
DependencyProperty.Register("ItemsSource", typeof(Dictionary<string, object>), typeof(MultiSelectComboBox), new FrameworkPropertyMetadata(null,
new PropertyChangedCallback(MultiSelectComboBox.OnItemsSourceChanged))); public Dictionary<string, object> ItemsSource
{
get { return (Dictionary<string, object>)GetValue(ItemsSourceProperty); }
set
{
SetValue(ItemsSourceProperty, value);
}
} private static void OnItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MultiSelectComboBox control = (MultiSelectComboBox)d;
control.DisplayInControl();
}
使用MVVM模式,在Views中添加这个控件;在ViewModel中给ItemsSource设定绑定值,如下:
views:
<control:MultiSelectComboBox x:Name="mcWind"
Visibility="{Binding ShowWind, Converter={StaticResource BooleanToVisibilityConverter}}"
ItemsSource="{Binding ItemsWind,Mode=TwoWay}" SelectedItems="{Binding SelectedItemsWindt, Mode=TwoWay}" />
ViewModel:
public void InitWind()
{
if (ItemsWind == null )
{
ItemsWind = new Dictionary<string, object>();
} ItemsWind.Clear(); var lstStation = GetSelectedStationIds();
var lstModel = GetSelectedModelIds();
foreach (var kv in DataCache.Instance.Winds)
{
//WindTurbine w = kv.Value as WindTurbine;
if (lstStation.Contains(kv.WindPowerStationId) &&
lstModel.Contains(kv.ModelId))
{
ItemsWind.Add(kv.Name, kv);
}
}
}
这时问题来了:在ViewModel中多次执行InitWind, 只有第一次PropertyChangedCallback 成功了,后续再修改ItemsWind,控件中的ItemSource更新了,但是PropertyChangedCallback 却不触发了。简单的讲,就是依赖属性的绑定成功了,但属性改变的回调函数却不触发~
在stackoverflow中有人似乎遇到了同样的情况,但回复的大牛们似乎都搞错了状况:
http://stackoverflow.com/questions/10139475/dependencyproperties-propertychangedcallback-only-called-once
http://stackoverflow.com/questions/5795770/wpf-propertychangedcallback-triggered-only-once
很多人说绑定被破坏、死循环云云~,就是没有合适的解决方法
最终我的处理方案,其实很简单:在ViewModel中给一个新的地址(引用),如下:
public void InitWind()
{ Dictionary<string, object> dictWind = new Dictionary<string, object>(); var lstStation = GetSelectedStationIds();
var lstModel = GetSelectedModelIds();
foreach (var kv in DataCache.Instance.Winds)
{
if (lstStation.Contains(kv.WindPowerStationId) &&
lstModel.Contains(kv.ModelId))
{
dictWind.Add(kv.Name, kv);
}
} ItemsWind = dictWind;
}
浪费了大半天时间调试,作此笔记备忘~
PropertyChangedCallback 只触发了一次?的更多相关文章
- Qt中使用定时器(可使用QObject::timerEvent定时执行,QTimer::singleShot可只触发一次)
在Qt中使用定时器有两种方法,一种是使用QObiect类的定时器:一种是使用QTimer类.定时器的精确性依赖于操作系统和硬件,大多数平台支持20ms的精确度 1.QObject类的定时器 QObje ...
- 只有一个form 的程序, onactivate 只触发一次。
https://blog.csdn.net/saint13/article/details/454615 Form的onActivate事件 2005年08月15日 01:08:00 阅读数:3406 ...
- Jquery/js引入的button的onclik事件只触发一次
目标描述 我要实现的是:通过监听button的click事件,从而通过ajax向servlet发送请求获取数据库中的数据,然后返回的页面,并要求局部刷新 一次页面的加载是html直接页面初始化本身的 ...
- iOS定时器按钮短时间内多次点击只触发一次事件方法
今天在看别人代码的时候,有个个60秒获取验证码的功能,做了个定时器,按钮触发定时器,点击按钮后设置按钮的enabled为NO,逻辑来讲都是没问题的 但是实际操作的时候,恶意的在短时间内多次点击那个获取 ...
- 使用input file上传文件中onChange事件只触发一次问题
每次上传文件的时候,都会将当前的文件路径保存至$event.target.value中,当第二次选择文件时,由于两次$event.target.value相同,所以不会触发change事件. 解决方案 ...
- jquery hover事件只触发一次动画
最近工作时遇到个关于动画的问题,如下: $("div").hover( function() { $(this).animate({"margin-top":& ...
- js函数只触发一次
如何让js中的函数只被执行一次?我们有时候会有这种需求,即让一个函数只执行一次,第二次调用不会返回任何有价值的值,也不会报错.下面将通过三个小demo展示使用的方法,当做个人笔记. 1.通过闭包来实现 ...
- js -- 绑定的click addEventListener 事件只触发一次
var btn = document.getElementById('btn'); // 添加事件绑定 btn.addEventListener('click', btnClick, false); ...
- 解决bootstrap-table多次请求只触发一次的问题
在初始化table之前,要将table销毁,否则会保留上次加载的内容 1 $("#table").bootstrapTable('destroy'); 2 $("#tab ...
随机推荐
- 相同的问题又出现了,struts2取不出数值
debug里面是有数值的,不知道是不是又是表示错了.全部改成了小写也无济于事.正在想法解决中... 问题解决了,因为自己的不仔细,问题还是出在了action的set,get方法里,不是大小写没注意,改 ...
- python学习笔记:文件操作和集合(转)
转自:http://www.nnzhp.cn/article/16/ 这篇博客来说一下python对文件的操作. 对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句 ...
- java 调用 r, Can't find dependent libraries
rJava是一个R语言和Java语言的通信接口,通过底层JNI实现调用,允许在R中直接调用Java的对象和方法. 步骤: 1.本地系统: Win7 64bit 企业版, jdk1.8.0_45,R3. ...
- Asp.net using Oracle.DataAccess.dll access oracle 11g 64bit & x86
使用.net访问oracle数据库时一般需要在机器上安装instantclient才能正常连接. 下面介绍一种不用安装instantclient直接引用dll就用.net能连接oracle数据库的方法 ...
- Android源代码结构分析
Google提供的Android包含了:Android源代码,工具链,基础C库,仿真环境,开发环境等,完整的一套.第一级别的目录和文件如下所示:----------------├── Makefile ...
- Delphi下使用Oracle Access控件组下TOraSession控件链接
Delphi下使用Oracle Access控件组下TOraSession控件链接数据库,使用 orsn1.Options.Direct:=true; orsn1.Server:=IP:Port: ...
- search--搜索引擎的使用笔记
重度使用 完全匹配搜索 “”把搜索词放在双引号中 搜索不包含该词 减号- 常用的通配符 星号* 站内搜索site docker site:http://blog.daocloud.io/ 扩大范围搜索 ...
- IDE警告信息不应该被忽略
当ide进行编译时提示有变量未使用 可能意味着变量使用错误 因为我们没理由创建一个变量却不去使用他 如if语句判断一个int 或者日期 等其他非空类型是否为null 总是true 这意味这我们在逻辑处 ...
- delphi日期格式化免操作系统依赖单元
delphi免操作系统依赖单元 经常在windows里面,我们需要yyyy-mm-dd格式日期,可是用户却没有设置成这个 格式,而用程序去修改用户的日期格式设置,是不明智的,将影响其他程序的运行. 本 ...
- 近期oepnfire工作总结.
1.优化订阅好友流程,增加验证消息2.优化好友查询模块,实现对扩展字段的查询.如批量匹配通讯录.3.实现webservice接口方式消息推送功能,供其他系统调用.4.实现花名册版本(XEP-237), ...