2010-06-03 2 views
1

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

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

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

Отзывы?

ответ

2

Оцените класс Посыльного от MVVMLight. Это помогает в общении между ViewModels.

И дать этому попытку:

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

+0

Проверено MVVMLight ... Мне нравится идея класса Messger ... спасибо! –

2

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

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

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

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

Смежные вопросы