无法设置按钮.c# WPF中的IsEnabled=true

本文关键字:中的 IsEnabled true WPF 设置 按钮 | 更新日期: 2023-09-27 17:54:49

这个问题听起来很简单。假设按钮。IsEnabled == false,当我执行按钮时。IsEnabled = true;按钮仍然是假的!!(通过使用Visual Studio 'watch'功能,在调试器中设置后立即查看值)

显然,这种情况并不常见,因为通常情况下代码是可以工作的。但很明显,系统中有一些东西阻碍了设置,我正在寻找可能是什么东西的想法。起初我认为这是因为按钮被钩到一个iccommand,它显然控制IsEnabled设置本身。所以我取消了I命令。这适用于不同的按钮,但此按钮没有通过"Command={Binding Path…}"钩到ICommand。事实上,这个按钮是在c#中创建的:

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

这些按钮存在于自定义控件工具栏中,并且试图设置其值的代码发生在我编写的PropertyChanged事件处理程序中。奇怪的是,相同的代码最初成功地将按钮设置为false,并且成功了!什么可能会禁止设置IsEnabled=true?

几个小时后:

呸,菜鸟犯的错误(在IT行业干了35年)。在代码的下面是这样一行:
button.Command = new myCommand(...); 

所以,事实上,这个按钮是通过命令界面连接起来的。我把它拿出来,换成了一个按钮点击事件处理程序,问题就解决了。由于我在谷歌中找不到这个问题,经过多次搜索,让我重申这个问题,以防其他人遇到它:当你将一个iccommand连接到一个元素,例如按钮,菜单项等。net接管了IsEnabled属性。

无法设置按钮.c# WPF中的IsEnabled=true

我知道你回答了这个问题,但看起来你只是把新风格的代码撕掉了,又回到了旧的方式。所以,如果你想知道这种新方法是如何工作的,那就往下读吧。

命令是事件系统的改进!命令取代了IsEnabled属性和Click事件,并允许您定义有用的命令快捷方式。

一旦你把一些东西连接到一个命令,你就不应该再为那个东西使用IsEnabled或Click。

与"IsEnabled = True"等价的命令是从命令的CanExecute事件处理程序返回True。

然后,为命令定义一个已执行的处理程序,它将取代Click事件。

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