背景:
最近重写了一个控件,并且在重写类内部声明了一个依赖属性,通过this.DataContext = this; 正常绑定也没有问题。
然后再其他的界面上通过引入方法导入了控件,类似<ctrl:CheckButtonEx IsChkBtnChecked = "{bind IsDataRight}" />然后运行提示原来的控件类不存在IsDataRight属性。
当然肯定也无法正常使用了。
IsDataRight这个属性是在当前界面中对应的模型下面实现了INotifyPropertyChanged接口下使用的,其他绑定的都是正常的。
解决过程:
出现这个问题,一直找不到答案,后来才知道,绑定的下上文出现了两次,一个是控件内部绑定了上线文为自身。第二个就是控件使用的地方,绑定了界面模型使用的属性。
现在的问题就是这个绑定的属性是找不到位置,想想也是,才开始我们绑定了上下文为控件自身的类对象了。
很明显是冲突了。
既然不能直接绑定,那么我们使用另外一种方式,不直接绑定上下文,然后对象初始化的时候再自行去找属性的位置应该就可以了。
第一步,首先移除控件内部的绑定上下文,就是这句 this.DataContext = this;
第二步,修改控件里面Binding的方式,原来是直接绑定的,现在已经移除第一步的设置,自然就无效了。
- {Binding IsChkBtnChecked ,RelativeSource={RelativeSource AncestorType={x:Type UserControl}}, Mode=TwoWay}
复制代码
这样就可以实现多重绑定,让控件自己的依赖属性单独动态去确定相对的源对象,自然到内部就是当前控件对象了。
最后一步,在界面上使用控件地方改成双向更新,不然你的修改数据无法触发源(控件对象)的更新
- <ctrl:CheckButtonEx IsChkBtnChecked = "{bind IsDataRighg, Mode = TwoWayt}" />
复制代码 特此记录,以便后来者学习。
|