| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .NET для новичков > Использование команд |
| Автор: Alexstudent 23.5.2013, 16:34 | ||||||||
| Вот нашел в инете образец кода, по обработке события нажатия кнопки. Приложение то было написано с на WPF с применением патерна MVVM. Сам код по отдельности все элементы вроде более менее понятны, а все вместе нет вот сам код : 1. отдел ViewModel:
-- идет объявления свойства с целью прибиндить его к кнопке в XAMLE
-- событие возникающее при нажатии на кнопку Код XАML
Далее класс обработки события:
а вот что здесь происходит, по отдельности что то вроде понимаю а все вместе не допираю и с трудом представляю а если надо какое другое событие сделать...как писать хрен его знает, нигде почитать толком не могу методу..уже день по форумам и книгам лажу...капец какой-то( |
| Автор: gambit 31.5.2013, 11:07 |
| покопай начиная отсюда - http://msdn.microsoft.com/ru-ru/library/ms752308.aspx Если нереально сильно кратко, то команды, это аналог биндинга, только для методов. Привязка происходит к объекту команды, каждый из которых содержит ссылку на метод и ссылку на булевское свойство, которое определяет, можно ли в данный момент нажать эту кнопку. Приаттачил, малюсенький пример, с централизованной реализацией ICommand и показыванием сути команд. |
| Автор: gambit 31.5.2013, 11:09 |
| Что бы быстро писать команды, когда то писал сниппет. Не жалко, по этому он тоже приаттачен. В расширении дописать букву t, иначе форум не позволил залить тип файла *.snippet Добавлено через 10 минут и 25 секунд А, и конечно тема топика должна отражать суть вопроса, сейчас модераторы подбегут, надают по шапке. |
| Автор: gambit 2.6.2013, 22:54 |
| Модератор: Название темы должно отражать ее суть! |
| Автор: dzaraev 29.6.2013, 12:04 | ||||
Происходит следующее: У класса Button есть свойство Command (унаследованное), и вы на него установили такой биндинг: Command="{Binding ClickCommand} . Когда у вашего Button или у кого-то из её предков (выше по дереву элементов) свойство DataContext становится отличным от null, этот биндинг, (который сидит на свойстве Command) устанавливает значение свойства Command равным значению свойства ClickCommand вашей ViewModel'и. Всё, теперь Button.Command указывает на экземпляр ICommand, который когда-то был присвоен ViewModel.ClickCommand. При этом Button сразу же подписывается на событие ICommand.CanExecuteChanged и вызывает метод ICommand.CanExecute(parameter) (а также вызывает его каждый раз, как приходит событие CanExecuteChanged). Если Button получить от метода CanExecute значение false - он установит своё свойство IsEnabled в false (думаю понятно - почему). Если же последний вызов CanExecute вернул true, кнопка будет доступна и Button.IsEnabled будет в значении true. Далее, юзер кликает Button (если она доступна). Button, соответственно, вызывает всякие события, типа MouseLeftButtonDown и т.д. а вот поооосле них - Button проверяет своё свойство Command. И если это свойство не null (а оно у нас уже не null), то Button, вызывает у своего объекта ICommand метод Execute(object parameter). Возможно вы спросите - откуда Button, берёт parameter. Всё очень просто, у Button есть свойство CommandParameter - вот его значение она тупо бодро берёт и передаёт методам ICommand.CanExecute(parameter) и ICommand.Execute(parameter). Таким образом клик юзера достигает делегата, который вы передавали в конструктор Command(Action<object> action), когда инициализировали свойство ClickCommand класса ViewModel.
Если вам необходимо привязать произвольное событие на свойство типа ICommand, то встроенного способа к сожалению нет. Либо контрол поддерживает свойство Command или иное свойство с типом ICommand, либо - выкручивайтесь как хотите. А выкручиваются в данной ситуации с помощью http://msdn.microsoft.com/ru-ru/library/ms749011.aspx. Есть множество подходов к написанию так называемых behavior'ов, но они как правило индивидуально делаются под конкретные задачи. http://zamjad.wordpress.com/2011/06/07/convert-event-into-command-in-mvvm-model/. |