Caliburn.Micro(CM) 穿过 Popup 绑定方法
今天一个朋友,在用CM框架中,在一个ListView的DataTemplate,中用了个Popup,发现绑定不到VM(集合外的VM,即ListView的DataContext)中的方法了。我查了一下CM的源码,固留档在此。
在CM框架中,绑定方法,如果当前的DataContext没有找到对应的方法,会去遍历VisualTree,上的对象的 DataContext , 至到找到对应的方法或 遍历完成。
但是 Popup 他的本质就是一个窗口,他等于是自有VisualTree,他的根是PopupRoot, 在对PopupRoot再掉用 VisualTreeHelper.GetParent时,返回值为null。
其实我们要做的就是,在发现是 PopupRoot的时候,处理一下。
代码:
ActionMessage.SetMethodBinding = context =>
{
var source = context.Source; DependencyObject currentElement = source;
while (currentElement != null)
{
if (Action.HasTargetSet(currentElement))
{
var target = Message.GetHandler(currentElement);
if (target != null)
{
var method = ActionMessage.GetTargetMethod(context.Message, target);
if (method != null)
{
context.Method = method;
context.Target = target;
context.View = currentElement;
return;
}
}
else
{
context.View = currentElement;
return;
}
} //修改部分 Begin
var pElement = VisualTreeHelper.GetParent(currentElement);
if (pElement == null
&& currentElement.GetType().Name.Equals("PopupRoot", StringComparison.OrdinalIgnoreCase))
{
var ef = currentElement as FrameworkElement;
if (ef != null)
{
pElement = ef.Parent;
}
} currentElement = pElement;
//End
} if (source != null && source.DataContext != null)
{
var target = source.DataContext;
var method = ActionMessage.GetTargetMethod(context.Message, target); if (method != null)
{
context.Target = target;
context.Method = method;
context.View = source;
}
}
};
只有红的部分是我修改了的,别的地方都为源码中的。
PS:
因为CM只能算是一个小众的框架,稍稍的扫下盲,指对这一块,对此有了解的可以略过。
CM中好多的方法是用静态委托方式实现的,而且还是公有的,我们很容易的在外面对其进行重写,而不用去重新编辑源码。So Cool!
本文原创
转载请注明出处:http://www.cnblogs.com/gaoshang212/p/4203929.html
Caliburn.Micro(CM) 穿过 Popup 绑定方法的更多相关文章
- WPF Caliburn.Micro ListView 批量删除 新方法.高效的
上一片我做的批量删除,是更具ListView的选项改变事件,然后放到一个全局变量里面,缺点已经说了.这次又找到一个好的方法.和大家分享一下.这次我将删除按钮的click事件里面的参数绑定为ListVi ...
- [WPF] Caliburn Micro学习三 Binding
Caliburn Micro学习一 Installation Caliburn Micro学习二 Infrastructure 如果说WPF推崇的Binding开辟了一条UI开发新的方式——让写代码的 ...
- 使用Caliburn.Micro系列1:新建项目并引入CM
一.WPF的几个MVVM模式实现 MVVMLight:小众的平民框架,实现简单粗暴. pass:最近更新在15年 官网: http://www.mvvmlight.net/ 最近一篇内容全面的好文: ...
- Enterprise Library +Caliburn.Micro+WPF CM框架下使用企业库验证,验证某一个属性,整个页面的文本框都变红的原因
我用的是CM这个框架做的WPF,在用企业库的验证的时候,我用标签的方式给一个属性加了不能为空的验证,但整个页面的所有控件的外面框都变红了.原因是CM框架的绑定方式是直接X:Name="你的属 ...
- Caliburn.Micro - IResult and Coroutines
IResult and Coroutines 翻译[三台]:网址[http://home.cnblogs.com/u/3Tai/] Previously, I mentioned that there ...
- Xamarin 的 MVVM 之 Caliburn.Micro
约定 Caliburn.Micro 以下简称 CMXamarin.Form 以下简称 XF 摘要CM 当前已释出 3.0 beta 版https://github.com/Caliburn-Micro ...
- AvalonDock 2.0+Caliburn.Micro+MahApps.Metro实现Metro风格插件式系统(一)
随着IOS7由之前UI的拟物化设计变为如今的扁平化设计,也许扁平化的时代要来了,当然我们是不是该吐槽一下,苹果什么时候也开始跟风了,自GOOGLE和微软界面扁平化过后,苹果也加入了这一队伍. Aval ...
- Caliburn.Micro(MVVM框架)
一.首启窗体设置 1. 创建一个新的WPF应用程序并添加NuGet包:Caliburn.Micro 2. 删除项目自带的主窗口文件MainWindow.xaml 3. 在App.xaml项目文件中,删 ...
- 【整理总结】代码沉淀 - Caliburn.Micro - MV*模式短小精悍的框架
Caliburn.Micro - Xaml made easy. web: https://github.com/Caliburn-Micro/Caliburn.Microdocument: http ...
随机推荐
- The prefix "context" for element "context:component-scan" is not bound.
在beans里面加上下面信息: xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLo ...
- 第一零二天上课 PHP TP框架 引入文件路径问题和调用验证码的方式
外部文件引入到视图模板的方式 1,将外部文件放在Public文件夹下,用load标签引入 2,在模板出书写引入代码(方法有很多,只有以下方法不容易出问题) <load h ...
- javascript-test1
var AAA = function(name, age) { this.name = name ; this.age = age; } AAA.prototype.getName = functio ...
- MySQL相关操作知识
1.解决客户端联不上MySQL服务器的问题: GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '' WITH GRANT OPTION; ...
- python 获取文件夹大小
__author__ = 'bruce' import os from os.path import join,getsize def getdirsize(dir): size=0l for (ro ...
- web应用中对配置文件的包装
<bean id="placeholderConfig" class="com.shz.utils.AdvancedPlaceholderConfigurer&qu ...
- 转 对菜鸟开发者的叮咛:花一万个小时练习Coding,不要浪费一万小时无谓地Debugging
原文见http://blog.jobbole.com/74825/ Coding 之于科技的重要性不言可喻,也不再是软体工程师的专利,医师.律师.会计师.护理师.金融从业人员,甚至是听起来摸不着边的政 ...
- 查找SQL数据表或视图中的字段属性信息
一.只支持表,非常牛逼的 SELECT a.name,(case when (SELECT count(*) FROM sysobjects WHERE (name in (SELECT name F ...
- WPF中获得控件相对于控件的相对位置
GeneralTransform generalTransform = lstitem.TransformToAncestor(this.BackStack); Point point = gener ...
- Oracle primary,unique,foreign 区别,Hibernate 关联映射
Oracle primary,unique,foreign 区别 转:http://www.cnblogs.com/henw/archive/2012/08/15/2639510.html NOT N ...