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 ...
随机推荐
- 异步编程:When.js快速上手
前些天我在团内做了一个关于AngularJS的分享.由于AngularJS大量使用Promise,所以我把基于Promise的异步编程也一并介绍了下.很多东西都是一带而过,这里再记录下. Angula ...
- LR工具使用之场景设置
LR工具使用之场景设置 一.操作步骤 1.运行loadrunner,进入运行负载测试控件:
- oVirt-engine项目UI结构
1.管理面板文件路径 ovirt-engine/frontend/webadmin/modules/webadmin/src/main/java/org/ovirt/engine/ui/webadmi ...
- VC++ WINDOWS自定义消息范围
WINDOWS自定义消息WM_USER和WM_APP WM_USER常量是Windows帮助应用程序定义私有窗口类里的私有消息,通常使用WM_USER+一个整数值,但总值不能超过0x7FFF(十进制: ...
- 直接使用docker而无须加sudo
从0.5.2开始docker的守护进程总是以root用户来运行.docker守护进程绑定的是Unix的socket而不是一个TCP端口.Unix的socket默认属于root用户,所以,使用docke ...
- Android_getSystemService (demo_testNet)
今天主要通过一个案例来看下我们的Android 获取系统服务的问题. 我们通常能够看见登录QQ后如果没有网络的状态的时候,它会告诉你一句话:您进入了没有网络的异次元或者是什么网络连接错误等等.Andr ...
- C++中四种转换类型的区别
一.四种转换类型比较: 类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可 ...
- Lua __index元方法
[Lua __index元方法] 当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键.如果__ ...
- error in opening zip file 1 错误
项目部署服务启动时会出现: error in opening zip file 1 错误 原来是不同服务器编译过的jar包直接下载后发布有问题,重新上传本地编译好的lib下面的jar包后,启动服务,正 ...
- Python全栈--9 __import__ 反射和面向对象基础 self 封装 继承(多继承的顺序) 多态
一.反射 python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删 ...