Win7专业版系统下事件绑定的Command事件不执行

用MVVM模式做的项目,用ICommand命令绑定事件,代码如下:

ViewModel 里定义命令:public ICommand RemoveCommand { get; private set; },构造里初始化命令:RemoveCommand=new RelayCommand(Remove,CanExecute);

以下是RelayCommand 的定义。

public class RelayCommand : ICommand
{
#region Fields&Constructors

private readonly Action<object> _execute;
private readonly Predicate<object> _canExecute;

public RelayCommand(Action<object> execute)
: this(execute, null)
{
}

public RelayCommand(Action<object> execute, Predicate<object> canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute");
_execute = execute;
_canExecute = canExecute;
}

#endregion

#region Icommand Members

public void Execute(object parameter)
{
//if (parameter==null)
//{
// return;
//}
if (!CanExecute(parameter))
{
throw new InvalidOperationException("The command is not valid for execution, check the CanExecute method before attempting to execute.");
}

_execute(parameter);
}

public bool CanExecute(object parameter)
{
return _canExecute == null || _canExecute(parameter);
}

public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}

#endregion

View里是右键菜单绑定的命令:

<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem Header="删除" Command="{Binding RemoveCommand}" InputGestureText="Delete"/>
</ContextMenu>
</DataGrid.ContextMenu>

以上代码在Win7旗舰版系统,XP系统以及Win8系统都运行正常,唯独Win7专业版运行不执行删除函数,在CanExecute那就返回False了,右键菜单变灰,但是Win7专业版安装了VS后就好了,但是不能每个用户使用软件时都要安装VS啊,感觉是一些组件不全或是组件比较低级,不知道原因。

后来的解决办法,就是在View.cs 里用 public static RoutedUICommand  RemoveCommand  = new RoutedUICommand();定义了命令

private void CommandBinding_OnCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
//判读条件是否执行删除命令
}

private void CommandBinding_OnExecuted(object sender, ExecutedRoutedEventArgs e)
{

//执行删除命令
}

在View里:首先添加这个:

<UserControl.CommandBindings>
<CommandBinding Command="view:AnimationEditor.RemoveCommand" CanExecute="CommandBinding_OnCanExecute" Executed="CommandBinding_OnExecuted" ></CommandBinding>
</UserControl.CommandBindings>

然后在右键菜单里:

<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem Header="删除" Command="view:Editor.RemoveCommand" InputGestureText="Delete"/>
</ContextMenu>
</DataGrid.ContextMenu>

如此修改在任何系统下都没问题了,可是我还是不知道具体原因,请高手指教。

时间: 2024-10-13 16:16:38

Win7专业版系统下事件绑定的Command事件不执行的相关文章

Ubuntu与Win7双系统下,改变分区导致error:no such partition grub rescue&gt;

我电脑装的是windows和ubuntu双系统.在windows下改变分区,包括新建分区.删除分区.合并分区等操作,会造成Ubuntu的grub找不到分区,以致进入grub rescue模式.这时可以通过如下方式恢复.摘抄http://www.cnblogs.com/ZhangZhifeng1988/archive/2011/12/19/2294018.html如下: 上网找了很多方法问题终于解决了.网上的内容大概有那么三种,一种是用LiveCD,只有挂了的这一台电脑,在公司里也懒得再下系统刻C

WIN7/8系统下程序接收不到WM_COPYDATA 消息的原因和解决

在WIN7/win8,如果发送消息的程序用户权限低于和接收消息的程序,则消 息无法传递.发送程序必须等于或者等于接收程序的权限.如发送与接收 是同一个用户,或者发送是管理员帐户,接收是是普通用户,这样就可以 成功. 以下内容摘自: http://blog.csdn.net/tian_jinping/article/details/12950077 正如我们前文所说,等级的划分,是为了防止以下犯上.所以,有了用户 界面特权隔离,一个运行在较低特权等级的应用程序的行为就受到了诸多 限制,它不可以:

事件绑定和普通事件的区别

普通添加事件的方法: var btn = document.getElementById("hello"); btn.onclick = function(){ alert(1); } btn.onclick = function(){ alert(2); } 执行上面的代码只会alert 2 事件绑定方式添加事件: var btn = document.getElementById("hello"); btn.addEventListener("clic

事件绑定和普通事件有什么区别

普通添加事件的方法: var btn = document.getElementById("hello"); btn.onclick = function(){ alert(1); } btn.onclick = function(){ alert(2); } //执行上面的代码只会alert 2 事件绑定方式添加事件: var btn = document.getElementById("hello"); btn.addEventListener("cl

了解JQuery的事件绑定特性和事件命名空间机制,编写更好、更灵活的事件处理代码

JQuery中的bind()和unbind(),提供了事件的绑定和取消机制,既可以绑定html默认支持的事件,也能够绑定自定义的事件.JQuery支持自定义事件,这显然给编程带来了极大的灵活性.下面就一起学习下,jquery事件处理的一些特性. 1.JQuery中事件可以重复绑定,不会覆盖. $("#button1").bind("click",function(){ alert("func1"); }); $("#button1&qu

关于js中对事件绑定与普通事件的理解

普通事件指的是可以用来注册的事件: 事件绑定是指把事件注册到具体的元素之上. 通俗点说: 普通事件:给html元素添加一个特定的属性(如:onclick): 事件绑定:js代码中通过标记(id  tag class)获取元素,给元素添加特定的方法(如:onclick): 扩展:事件监听addEventListener事件可以绑定多次事件,并进行触发 div1.onclick = function(){}; <button onmouseover = " "></but

javascript事件绑定和普通事件的区别

区别就是:普通事件只支持单个事件,事件绑定可以添加多个事件. 代码: <!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Document</title> </head> <body> <button id="btn">button</butt

Android系统下用js自定义gesture事件(仿ios实现移动端事件一致)

.katex { display: inline-block; text-align: initial; } .katex { font-family: Consolas, Inconsolata, Courier, monospace; line-height: 1.2; white-space: nowrap; text-indent: 0px; text-rendering: auto; font-size: 1em; } .katex * { } .katex .katex-html {

CentOS7和win7双系统下修复win7启动项

把下面代码加到 /boot/grub2/grub.cfg 文件中,重启就可以看到win7的启动项了 ### BEGIN /etc/grub.d/30_os-prober ###     74 menuentry 'Windows 7 (loader) (on /dev/sda1)' --class windows --class os         $menuentry_id_option 'osprober-chain-C2AE5AA3AE5A8FB1' {     75 insmod pa