繁体   English   中英

无法在 C# WPF 中设置 button.IsEnabled=true

[英]Cannot set button.IsEnabled=true in C# WPF

这个问题听起来很简单。 假设 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?

几个小时之后:

呸,菜鸟的错误(在 IT 工作 35 年后)。 在代码中更进一步的是以下行:

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

所以,事实上,这个按钮是通过一个命令界面连接起来的。 我把它拿出来并用按钮单击事件处理程序替换它,问题就解决了。 由于我在谷歌中找不到这个问题,经过多次搜索,让我重申这个问题,以防其他人遇到它:当你将一个 ICommand 连接到一个 UIElement,例如按钮、菜单项等时,.Net 接管了 IsEnabled 属性。 您不能再以编程方式设置该属性。

我知道你回答了这个问题,但看起来你只是撕掉了新样式的代码并回到了旧的方式。 因此,如果您想了解新方法的工作原理,请继续阅读。

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

一旦您将某些内容连接到命令,您就不应再使用 IsEnabled 或 Click 来获取该内容。

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

然后,为 Command 定义一个 Executed 处理程序,它会替换 Click 事件。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM