最近在项目中自己写了一个控件A,继承自contentcontrol,实现了icommandsource接口。(因需求特殊并没有使用buttonbase及它的派生类为基类),控件A在测试程序中运转良好,绑定的命令响应方法能够被正确执行。下边代码是控件A执行命令的部分:

RoutedEventArgs rea = new RoutedEventArgs(Button.ClickEvent, this);
RaiseEvent(rea);if (!rea.Handled && Command != null)
{Command.Execute(CommandParameter);
}

  

但在实现项目中,我将控件A放在了另一个较为复制杂的控件B的template中,并在控件B的commandbindings中设置了命令绑定,命令使用的是WPF原生命令类型RoutedUICommand。这个时候诡异的事件发生了,不论我怎么在template里边设置控件A的commandtarget属性,上边代码执行了Command.Execute(CommandParameter)这句之后,B绑定的命令响应方法都不会被调用。

之后在群里问了一些大神,都没有得到解决方法,于是乎查了下.net码源,看看buttonbase是如何处理这个问题。

不看不知道,一看吓一跳,在buttonbase中处理命令时,用到了大量的.net项目里的internal类或方法(微软这是成心留一手啊!)

#from buttonbase.cs        /// <summary>
/// This virtual method is called when button is clicked and it raises the Click event
/// </summary>
protected virtual void OnClick()
{RoutedEventArgs newEvent = new RoutedEventArgs(ButtonBase.ClickEvent, this);RaiseEvent(newEvent);MS.Internal.Commands.CommandHelpers.ExecuteCommandSource(this);
}

  #from CommandHelpers.cs

internal static void ExecuteCommandSource(ICommandSource commandSource)
{CriticalExecuteCommandSource(commandSource, false);}internal static void CriticalExecuteCommandSource(ICommandSource commandSource, bool userInitiated)
{ICommand command = commandSource.Command;if (command != null){object parameter = commandSource.CommandParameter;IInputElement target = commandSource.CommandTarget;RoutedCommand routed = command as RoutedCommand;if (routed != null){if (target == null){target = commandSource as IInputElement;}if (routed.CanExecute(parameter, target)){routed.ExecuteCore(parameter, target, userInitiated);}}else if (command.CanExecute(parameter)){command.Execute(parameter);}}
}

 从上边.net这几段代码里我们可以看到,buttonbase在执行命令里的时候,使用的是 CommandHelpers这个内部类中定义的方法,而这个方法的核心逻辑是先判断使用的命令是不是RoutedCommand类型,如果是的话则可能会使用RoutedCommand的内方法ExecuteCore去执行命令,而在这个方法中才有commandtarget这个参数。

总结一下,如果你的控件不是继承自buttonbase,那么就不能使用RoutedCommand.RoutedCommand这个内部方法,不能使用这个内部方法那么RoutedCommand就不会认你自己设置的commandtarget,那么如果.net库自己找到target不对,你再怎么设置也是徒劳。。。(我感觉被微软深深伤害了)

说明白点,不要把自己实现icommandsource的类型与routedcommand搭配使用!

转载于:https://www.cnblogs.com/GuoRL/p/5778868.html

WPF之坑——ICommandSource与RoutedUICommand相关推荐

  1. WPF 踩坑 DataGrid DataGridTextColumn根据文本内容改变颜色绑定转换器

    Foreground 属性不会触发转换器!!!!!!!!!!! Foreground 属性不会触发转换器!!!!!!!!!!! Foreground 属性不会触发转换器!!!!!!!!!!!

  2. WPF下聊天气泡的实现

    零.版本履历 日期 说明 2020.05.02 初稿 一.效果 先看最终效果. 最终微聊烂尾了,更确切地说,还没开始就结束了. 二.由来 产品虽然没有最终做出来,但至少聊天气泡打磨的还挺像样的. 说说 ...

  3. C#事件中sender的小用法

    C#事件中sender的小用法 开WPF新坑了,看了WPF的炫酷界面,再看看winForm实在是有些惨不忍睹(逃).后面会开始写一些短的学习笔记. 一.什么是sender sender最常见到的情况就 ...

  4. C#事件中sender的小用法(转载)

    C#事件中sender的小用法 开WPF新坑了,看了WPF的炫酷界面,再看看winForm实在是有些惨不忍睹(逃).后面会开始写一些短的学习笔记. 一.什么是sender sender最常见到的情况就 ...

  5. 2019-8-28-WPF-开发

    title author date CreateTime categories WPF 开发 lindexi 2019-8-28 11:3:39 +0800 2018-2-13 17:23:3 +08 ...

  6. WPF 自定义控件的坑(蠢的:自定义控件内容不显示)

    WPF 自定义控件的坑(蠢的:自定义控件内容不显示) 原文:WPF 自定义控件的坑(蠢的:自定义控件内容不显示) 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csd ...

  7. slider wpf 垂直_WPF自定义Slider样式踩坑记录

    0x01. 概要 WPF 自带的拖动条控件是 Slider, 其默认样式为: 这种风格一般很难和实际的APP匹配, UI肯定会给一种自己的APP风格的拖动条. 最简单的莫过于修改滑块图案, 滑轨颜色等 ...

  8. WPF 坑系列之一 颜色渐变动画

    WPF 颜色渐变动画 坑 动画对象不能用于动画属性"BorderBrush",因为它是不兼容的类型"System.Windows.Media.Brush" &l ...

  9. 【wpf】[踩坑日记] “组件“XXX”不具有由 URI“XXX“识别的资源”

    报错背景 这是一个和反射相关的奇怪问题: 具体报错如下: 报错的地方是: 这里是我想通过,prism提供的方式,弹出一个子窗口.这里prism应该也是用到的反射技术. 本来这段代码是正常工作的. 但是 ...

最新文章

  1. js防止客户端多触发
  2. “旧城改造”的背后——银泰新零售阿里云解决方案(上)
  3. 用Perl做个简单”下载者病毒”
  4. 什么是回调地狱以及promise的链式调用和aysnc/await
  5. leetcode213. 打家劫舍 II
  6. js中for循环调用回调函数,一直循环最后一个
  7. (23)Verilog HDL条件语句:if-else语句
  8. [Teaching] [Silverlight] 30秒快速建立遊戲迴圈 (Game Loop)
  9. 深度学习中常用的数据集
  10. Android开发眼镜店管理系统,智能眼镜店管理系统(基于BS架构互联网版)下载_智能眼镜店管理系统(基于BS架构互联网版)官方下载-太平洋下载中心...
  11. 别让生活 耗尽了你的耐心和向往 你还有诗和远方...
  12. 股市前复权、后复权与不复权
  13. 一 . css系列之html需知及ps的基础操作
  14. 中国17家创业公司的失败史
  15. 学习C语言的一些感悟
  16. 【转载】第三方支付业务如何测试
  17. 局部保留投影算法(LPP)(Locality Preserving Projections)详解
  18. python读取文件路径报invalid_Python: 目录名无效怎么办?
  19. 快来学学爱用建站新功能【Light Press】微单页,超级实用
  20. 在ArcMap中添加经纬网

热门文章

  1. CTFshow php特性 web149
  2. CTFshow 信息收集 web12
  3. 第三周实践项目8 以第一个元素为分界线,将所有小于它的元素移到该元素的前面,将所有大于它的元素移到该元素的后面。
  4. cat--创建多维数组
  5. Spectral clustering 谱聚类讲解及实现
  6. C++:顺序表的基本操作(待完善)
  7. 第七篇T语言实例开发,文本与程序的几种打开方法(版5.3)
  8. linux服务器同时运行两个或多个tomcat
  9. 学习前端html 设置样式
  10. 生活中的实验 —— 磁铁的使用