Доступ к элементам управления изнутри команд в WPF - PullRequest
1 голос
/ 03 июня 2010

У меня есть приложение WPF, меню которого использует командные возможности. Все подключено очень хорошо, и когда я нажимаю кнопки в меню, команды запускаются. Однако у меня возникают проблемы с получением статуса IsEnabled кнопки для соблюдения части CanExecute моих команд.

Одна из проблем - команды должны видеть, что вы делаете в пользовательском интерфейсе. Например, одна команда должна быть доступна только тогда, когда выбраны определенные элементы в ListBox, поэтому мне нужно получить ссылку на ListBox ... но, поскольку команда представлена ​​в моей модели представления (шаблон MVVM), она не имеет доступ к пользовательскому интерфейсу (кстати, меню находится в одном пользовательском элементе управления [parent = mainwindow], а ListBox - в другом пользовательском элементе управления [parent = mainwindow]).

Кроме того, даже когда я жестко кодирую метод команды CanExecute, возвращающий значение false, свойство Enabled кнопки не изменяется ... команда не запускается, но не изменяется ... расстраивает. Я предполагаю, что мне нужно изменить / поднять событие CanExecuteChanged, но я не уверен, когда мне следует это делать (не могу найти хороший образец).

Обратная связь

Ответы [ 2 ]

2 голосов
/ 03 июня 2010

Попробуйте класс Messenger от MVVMLight . Это помогает в общении между ViewModels.

И попробуйте:

Имейте свойство SelectedItem в ViewModel вашего ListBox. Трансляция сообщений при изменении свойства. Зарегистрируйтесь для этого сообщения в ViewModel меню. Используйте свойство SelectedItem в своем методе CanExecute для своей логики.

2 голосов
/ 03 июня 2010

Обычно вы привязываете свойство Command элемента MenuItem / Button к чему угодно - это означает, что у вас все еще есть CommandParameter для работы - это может быть затем привязано к некоторому другому элементу управления. Тем не менее, когда два представления не знают друг друга, вам нужен некоторый вид посредника между ними (т. Е. Модель представления, к которой могут обращаться оба представления - привязайте список SelectedItem / SelectedItems к свойству двумя способами - и разрешите CommandParameter привязать к одному и тому же свойству в одну сторону).

Что касается того, когда следует запускать событие CanExecuteChanged - вы должны запускать его всякий раз, когда происходит изменение в логике, содержащейся в CanExecute-методе. Если оно всегда ложно, вы никогда не должны запускать событие, так как оно будет читать начальное значение, когда установлен параметр Command. «

Если ваша кнопка ведет себя странно - проверьте, не влияет ли свойство IsEnabled на стили или установлено напрямую.

Надеюсь, это поможет.

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