Невозможно установить button.IsEnabled = true в C # WPF - PullRequest
3 голосов
/ 05 мая 2011

Этот вопрос так прост, как кажется.Предположим, button.IsEnabled == false, когда я выполняю button.IsEnabled = true;кнопка остается ложной !!(С помощью функции просмотра Visual Studio для немедленного просмотра значения после его установки в отладчике)

Очевидно, что это не обычное явление, так как обычно этот код работает.Но очевидно, что в системе есть что-то, что блокирует настройку, и я ищу идеи о том, что это может быть.Сначала я подумал, что это потому, что кнопка была подключена к ICommand, который, очевидно, контролирует сам параметр IsEnabled.Поэтому я устранил ICommand.Это работало для другой кнопки, но эта кнопка не подключена к ICommand через "Command = {Binding Path ...}".Фактически эта кнопка создается в C # просто:

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

Эти кнопки существуют на панели инструментов пользовательского элемента управления, и код, который пытается установить их значение, появляется в обработчике событий PropertyChanged, который я написал.Любопытно, что тот же код изначально успешно устанавливает кнопку в false, и это работает!Что может быть запрещающим установку IsEnabled = true?

Несколько часов спустя:

Бах, ошибка новичка (после 35 лет в ИТ).Далее в коде была строка:

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

Таким образом, фактически кнопка была подключена через командный интерфейс.Я взял это и заменил его обработчиком событий нажатия кнопки, и проблема решена.Поскольку я не смог найти эту проблему в Google, после многочисленных поисков, позвольте мне переформулировать проблему в случае, если другие столкнутся с ней: когда вы подключаете ICommand к UIElement, например, button, menuitem и т. Д. .Net принимает свойство IsEnabled.Вы больше не можете устанавливать это свойство программно.

1 Ответ

2 голосов
/ 06 сентября 2011

Я знаю, что вы ответили на это, но похоже, что вы просто вырвали код нового стиля и вернулись к старому.Поэтому, если вы хотите узнать, как работает новый способ, читайте дальше.

Команды - это усовершенствование системы событий!Команды заменяют свойство IsEnabled и событие Click и позволяют вам определять полезные ярлыки для команды.

Как только вы подключаете что-то к команде, вам больше не следует использовать IsEnabled или Click для этого.

Командный эквивалент «IsEnabled = True» должен возвращать True из обработчика события CanExecute команды.

Затем определите обработчик Executed для команды, и это заменит событие Click.

Почему это хорошо?Просто: вы можете подключить кнопку панели инструментов, пункт меню, пункт контекстного меню и, возможно, некоторые другие части интерфейса к Команде, и вам не нужно отслеживать (или определять) свойства каждого из этих элементов илиСобытия.Подумайте о приложении текстового редактора.Традиционным способом было бы подключить событие к Edit> Copy, кнопке панели инструментов Copy и пункту контекстного меню;обработать событие SelectChanged TextBox, чтобы включить / отключить все это в зависимости от ситуации;и закодируйте событие Click для каждого из них.Новый способ: подключите команду к Edit> Copy, кнопке панели инструментов Copy и пункту контекстного меню, определите событие CanExecute, возвращающее true / false, в зависимости от свойства выбора TextBox, и закодируйте обработчик Executed.Выглядит похоже?Да, но вы объявляете соединения Command в разметке вместо кода, и вам не нужно писать почти столько же кода.Это дает большую экономию, когда у вас много команд.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...