2011-05-05 211 views
3

这个问题和听起来一样简单。假设button.IsEnabled == false,当我执行button.IsEnabled = true;该按钮仍然是假的! (通过使用Visual Studio'watch'功能在调试器中设置它之后立即查看该值)不能在C#中设置button.IsEnabled = true WPF

显然,这种情况并不像通常的代码那样常见。但是系统中显然存在一些阻碍设置的东西,我正在寻找关于它可能的想法。起初我以为是因为这个按钮被挂在了一个ICommand中,显然它控制着IsEnabled设置本身。所以我取消了ICommand。这适用于不同的按钮,但此按钮没有通过“命令= {绑定路径...}”挂接到ICommand。其实这个按钮在C#创建为简单:在自定义的控件工具栏存在

Button button = new Button(); 
button.Content = "Save Record"; 
button.IsTabStop = false; 

这些按钮和发生在的PropertyChanged事件处理程序我写这是试图建立自己的价值的代码。奇怪的是,相同的代码最初成功地将按钮设置为false,并且工作正常!什么可能会禁止设置IsEnabled = true?

几个小时后:

呸,新手的错误(35年后,在IT)。进一步在代码中的行是:

button.Command = new myCommand(...); 

所以,事实上,按钮是通过命令接口挂钩。我把它拿出来,并用按钮单击事件处理程序替换它,问题就解决了。由于我无法在Google中找到此问题,所以经过无数次搜索后,让我重申问题以防其他人遇到问题:当您将ICommand与UIElement挂钩时,例如,按钮,menuitem等.Net接管IsEnabled属性。您不能再以编程方式设置属性。

回答

2

我知道你已经回答了这个问题,但是看起来你只是掏出了新风格的代码,并回到了旧的方式。因此,如果你想知道新方法如何运作,请继续阅读。

命令是事件系统的改进!命令替换IsEnabled属性和Click事件,并让您为该命令定义有用的快捷方式。

一旦你将某些东西挂钩到一个Command中,你不应该再使用IsEnabled或Click来做那件事。

与“IsEnabled = True”等效的命令是从Command的CanExecute事件处理程序返回True。

然后,为命令定义一个Executed处理程序,并替换Click事件。

这是为什么这么好?简单:您可以将一个工具栏按钮,一个菜单项,一个上下文菜单项以及其他一些接口部件连接到Command上,并且不必跟踪(或定义)每个这些元素的属性或事件。想想一个文本编辑器应用程序。传统的方法是将事件连接到编辑>复制,复制工具栏按钮和上下文菜单项;处理TextBox的SelectionChanged事件以根据需要启用/禁用所有这些事件;并为每个人编写Click事件。新方法是:将命令挂钩到编辑>复制,复制工具栏按钮和上下文菜单项,根据TextBox的选择属性定义CanExecute事件以返回true/false,并对Executed处理程序进行编码。看起来类似?是的,但是你用标记而不是代码来声明命令连接,而且你不必编写几乎没有的代码。当你有很多命令时,它可以节省很多钱。

相关问题