在自定义的用户控件中,添加一个依赖属性,如下:

        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 只触发了一次?的更多相关文章

  1. Qt中使用定时器(可使用QObject::timerEvent定时执行,QTimer::singleShot可只触发一次)

    在Qt中使用定时器有两种方法,一种是使用QObiect类的定时器:一种是使用QTimer类.定时器的精确性依赖于操作系统和硬件,大多数平台支持20ms的精确度 1.QObject类的定时器 QObje ...

  2. 只有一个form 的程序, onactivate 只触发一次。

    https://blog.csdn.net/saint13/article/details/454615 Form的onActivate事件 2005年08月15日 01:08:00 阅读数:3406 ...

  3. Jquery/js引入的button的onclik事件只触发一次

    目标描述 我要实现的是:通过监听button的click事件,从而通过ajax向servlet发送请求获取数据库中的数据,然后返回的页面,并要求局部刷新 一次页面的加载是html直接页面初始化本身的 ...

  4. iOS定时器按钮短时间内多次点击只触发一次事件方法

    今天在看别人代码的时候,有个个60秒获取验证码的功能,做了个定时器,按钮触发定时器,点击按钮后设置按钮的enabled为NO,逻辑来讲都是没问题的 但是实际操作的时候,恶意的在短时间内多次点击那个获取 ...

  5. 使用input file上传文件中onChange事件只触发一次问题

    每次上传文件的时候,都会将当前的文件路径保存至$event.target.value中,当第二次选择文件时,由于两次$event.target.value相同,所以不会触发change事件. 解决方案 ...

  6. jquery hover事件只触发一次动画

    最近工作时遇到个关于动画的问题,如下: $("div").hover( function() { $(this).animate({"margin-top":& ...

  7. js函数只触发一次

    如何让js中的函数只被执行一次?我们有时候会有这种需求,即让一个函数只执行一次,第二次调用不会返回任何有价值的值,也不会报错.下面将通过三个小demo展示使用的方法,当做个人笔记. 1.通过闭包来实现 ...

  8. js -- 绑定的click addEventListener 事件只触发一次

    var btn = document.getElementById('btn'); // 添加事件绑定 btn.addEventListener('click', btnClick, false); ...

  9. 解决bootstrap-table多次请求只触发一次的问题

    在初始化table之前,要将table销毁,否则会保留上次加载的内容 1 $("#table").bootstrapTable('destroy'); 2 $("#tab ...

随机推荐

  1. Android IOS WebRTC 音视频开发总结(七六)-- 探讨直播低延迟低流量的粉丝连麦技术

    本文主要探讨基于WebRTC的P2P直播粉丝连麦技术 (作者:郝飞,亲加云CTO,编辑:dora),最早发表在[这里] 支持原创,转载必须注明出处,欢迎关注微信公众号blacker(微信ID:blac ...

  2. 学习打造自己的DEBUG_NEW

    学习范例http://www.cppblog.com/Robertxiao/archive/2012/11/05/194547.html 在使用MFC库开发程序时,我非常喜欢MFC框架中的内存泄漏诊断 ...

  3. free pascal 错误代码表

    free pascal 错误代码表 为了方便对照检查运行时错误代码,这里把所有的错误代码的含义整理出来.(最大序号为232,中间不一定连续.user.pdf P175) Run-time errors ...

  4. VC++ MFC 按钮的全部样式Style

    Button Styles BS_3STATE 与复选框一样本样式按钮可被单击变暗.变暗状态通常用于指示本样式的按键正处于禁用状态. BS_AUTO3STATE   与三状态的复选框一样当用户选中它本 ...

  5. 循序渐进Python3(三) -- 2 -- 内置函数

    上一篇我们介绍了21个最常用到的函数,简单列一下,帮助回忆巩固: 1.abs 2.dict 3.float 4.help 5.input 6.int 7.len 8.list 9.max 10.min ...

  6. super

    [super] Return a proxy object that delegates method calls to a parent or sibling class of type. This ...

  7. JSF 嵌套

    <ui:composition xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com ...

  8. 把 TBytes 转换为十六进制字符串

    function BytestoHexString(ABytes: TBytes; len: Integer): AnsiString; begin   SetLength(Result, len*) ...

  9. ExtJs弹出窗口

    1.Ext.Msg.alert(String title, String msg, [Function fn], [Object scope]) 显示一个标准的带有一个"确定"按钮 ...

  10. iOS模拟器设置输入中文

    1.打开模拟器,选择Settings; 2.选择General  ->KeyBoard ->KeyBoards,选择中文输入法Chinese(Simplified)即可 以前尝试试了很多方 ...