这个问题听起来很简单。假设button.IsEnabled == false,当我执行button.IsEnabled = true;按钮仍然是假的!! (通过使用Visual Studio“监视”功能在调试器中设置后立即查看该值)
显然,这并不常见,因为代码通常起作用。但是系统中显然存在阻碍设置的东西,我正在寻找关于它可能是什么的想法。起初我以为是因为按钮被挂在ICommand中,这显然控制了IsEnabled设置本身。所以我删除了ICommand。这适用于不同的按钮,但此按钮未通过“Command = {Binding Path ...}”挂钩到ICommand。事实上,这个按钮是用C#创建的:
Button button = new Button();
button.Content = "Save Record";
button.IsTabStop = false;
这些按钮存在于自定义控件工具栏中,试图设置其值的代码出现在我编写的PropertyChanged事件处理程序中。奇怪的是,相同的代码最初成功地将按钮设置为false并且有效!什么可能禁止设置IsEnabled = true?
几个小时后:
Bah,菜鸟错误(在IT工作35年后)。在代码中进一步向下是行:
button.Command = new myCommand(...);
因此,事实上,该按钮是通过命令界面连接的。我把它拿出来并用按钮点击事件处理程序替换它,问题解决了。由于我在Google中找不到这个问题,经过大量搜索后,让我重新解决问题,以防其他人遇到它:当你将ICommand连接到UIElement时,例如按钮,menuitem等.Net接管IsEnabled属性。您无法再以编程方式设置属性。
答案 0 :(得分:2)
我知道你回答了这个问题,但看起来你刚刚撕掉了新式的代码,然后回到过去。所以,如果您想了解新方法的工作原理,请继续阅读。
命令是Event系统的改进!命令替换IsEnabled属性和Click事件,并允许您为命令定义有用的快捷方式。
一旦你将某些东西挂钩到一个Command,你就不应再使用IsEnabled或Click for that。
命令等效于“IsEnabled = True”是从Command的CanExecute事件处理程序返回True。
然后,为Command定义一个Executed处理程序,这将取代Click事件。
为什么这样好?简单:您可以将工具栏按钮,菜单项,上下文菜单项以及可能的其他界面部件连接到Command,并且您不必跟踪(或定义)每个元素的属性或事件。想想文本编辑器应用程序。传统方式是将事件与Edit>连接起来。复制,复制工具栏按钮和上下文菜单项;处理TextBox的SelectionChanged事件以适当地启用/禁用所有这些;并为每个人编写Click事件的代码。新的方法是:将命令挂钩到编辑>复制,复制工具栏按钮和上下文菜单项,根据TextBox的选择属性定义CanExecute事件以返回true / false,并对Executed处理程序进行编码。看起来相似?是的,但是您在标记而不是代码中声明了Command连接,并且您不必编写几乎相同的代码。当你有很多命令时,它会节省很多钱。