![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
Alexstudent |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 17.5.2013 Репутация: нет Всего: нет |
Вот нашел в инете образец кода, по обработке события нажатия кнопки. Приложение то было написано с на WPF с применением патерна MVVM. Сам код по отдельности все элементы вроде более менее понятны, а все вместе нет
вот сам код : 1. отдел ViewModel:
-- идет объявления свойства с целью прибиндить его к кнопке в XAMLE
-- событие возникающее при нажатии на кнопку Код XАML
Далее класс обработки события:
а вот что здесь происходит, по отдельности что то вроде понимаю а все вместе не допираю и с трудом представляю а если надо какое другое событие сделать...как писать хрен его знает, нигде почитать толком не могу методу..уже день по форумам и книгам лажу...капец какой-то( |
||||||||
|
|||||||||
gambit |
|
|||
![]() Эксперт ![]() ![]() ![]() Награды: 1 Профиль Группа: Комодератор Сообщений: 1359 Регистрация: 25.6.2006 Где: я? Репутация: 3 Всего: 40 |
покопай начиная отсюда - http://msdn.microsoft.com/ru-ru/library/ms752308.aspx
Если нереально сильно кратко, то команды, это аналог биндинга, только для методов. Привязка происходит к объекту команды, каждый из которых содержит ссылку на метод и ссылку на булевское свойство, которое определяет, можно ли в данный момент нажать эту кнопку. Приаттачил, малюсенький пример, с централизованной реализацией ICommand и показыванием сути команд. Присоединённый файл ( Кол-во скачиваний: 1 ) ![]() |
|||
|
||||
gambit |
|
|||
![]() Эксперт ![]() ![]() ![]() Награды: 1 Профиль Группа: Комодератор Сообщений: 1359 Регистрация: 25.6.2006 Где: я? Репутация: 3 Всего: 40 |
Что бы быстро писать команды, когда то писал сниппет. Не жалко, по этому он тоже приаттачен.
В расширении дописать букву t, иначе форум не позволил залить тип файла *.snippet Добавлено через 10 минут и 25 секунд А, и конечно тема топика должна отражать суть вопроса, сейчас модераторы подбегут, надают по шапке. Присоединённый файл ( Кол-во скачиваний: 4 ) ![]() |
|||
|
||||
gambit |
|
|||
![]() Эксперт ![]() ![]() ![]() Награды: 1 Профиль Группа: Комодератор Сообщений: 1359 Регистрация: 25.6.2006 Где: я? Репутация: 3 Всего: 40 |
Модератор: Название темы должно отражать ее суть!
Это сообщение отредактировал(а) gambit - 2.6.2013, 22:54 |
|||
|
||||
jonie |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 6 Всего: 118 |
я добавлю простую фразу: XAML не позволяет делать байдинг напрямую к делегатам (в силу того что типов делегатов может быть много, но сами делегаты по сути своей могут иметь разные сигнатуры), поэтому эти делегнаты оборачиваются в некие классы, наследуемые от ICommand (вот к наследникам XAML умеет биндится) - в заглавном посте это как раз и показано - там делегат передается в конструктор. -------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
dzaraev |
|
||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 149 Регистрация: 12.1.2013 Репутация: 1 Всего: 1 |
Происходит следующее: У класса 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, либо - выкручивайтесь как хотите. А выкручиваются в данной ситуации с помощью вложенных свойств WPF. Есть множество подходов к написанию так называемых behavior'ов, но они как правило индивидуально делаются под конкретные задачи. Вот пример такой привязки события к ICommand. Это сообщение отредактировал(а) dzaraev - 29.6.2013, 12:08 --------------------
Если вопрос решён - помечайте тему. |
||||
|
|||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | .NET для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |