Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Использование команд 
:(
    Опции темы
Alexstudent
Дата 23.5.2013, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 17.5.2013

Репутация: нет
Всего: нет



Вот нашел в инете образец кода, по обработке события нажатия кнопки. Приложение то было написано с на WPF с применением патерна MVVM. Сам код по отдельности все элементы вроде более менее понятны, а все вместе нет
вот сам код :
1. отдел ViewModel:

Код

 public ICommand ClickCommand { get; set; }

-- идет объявления свойства с целью прибиндить его к кнопке в XAMLE

Код

private void ClickMethod()
        {
            MessageBox.Show("This is click command.");
        }

-- событие возникающее при нажатии на кнопку
Код XАML
Код

<Button Content="Click me" HorizontalAlignment="Left" Margin="291,97,0,0" VerticalAlignment="Top" Width="75" 
                Command="{Binding ClickCommand}"/>

Далее класс обработки события:
Код


namespace WpfApplication.ViewModel
{
    public class Command : ICommand
    {
        #region Constructor
 
        public Command(Action<object> action) 
        {
            ExecuteDelegate = action;
        }
 
        #endregion
 
 
        #region Properties
 
        public Predicate<object> CanExecuteDelegate { get; set; }
        public Action<object> ExecuteDelegate { get; set; }
 
        #endregion
 
 
        #region ICommand Members
 
        public bool CanExecute(object parameter)
        {
            if (CanExecuteDelegate != null)
            {
                return CanExecuteDelegate(parameter);
            }
 
            return true;
        }
 
        public event EventHandler CanExecuteChanged
        {
            add { CommandManager.RequerySuggested += value; }
            remove { CommandManager.RequerySuggested -= value; }
        }
 
        public void Execute(object parameter)
        {
            if (ExecuteDelegate != null)
            {
                ExecuteDelegate(parameter);
            }
        }
 
        #endregion
    }
}

а вот что здесь происходит, по отдельности что то вроде понимаю а все вместе не допираю и с трудом представляю а если надо какое другое событие сделать...как писать хрен его знает, нигде почитать толком не могу методу..уже день по форумам и книгам лажу...капец какой-то(
PM MAIL   Вверх
gambit
Дата 31.5.2013, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 3
Всего: 40



покопай начиная отсюда - http://msdn.microsoft.com/ru-ru/library/ms752308.aspx

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

Приаттачил, малюсенький пример, с централизованной реализацией ICommand и показыванием сути команд.

Присоединённый файл ( Кол-во скачиваний: 1 )
Присоединённый файл  CommandTest.zip 10,56 Kb
PM MAIL ICQ Skype   Вверх
gambit
Дата 31.5.2013, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 3
Всего: 40



Что бы быстро писать команды, когда то писал сниппет. Не жалко, по этому он тоже приаттачен.


В расширении дописать букву t, иначе форум не позволил залить тип файла *.snippet

Добавлено через 10 минут и 25 секунд
А, и конечно тема топика должна отражать суть вопроса, сейчас модераторы подбегут, надают по шапке.

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  command.snippe 1,46 Kb
PM MAIL ICQ Skype   Вверх
gambit
Дата 2.6.2013, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***
Награды: 1



Профиль
Группа: Комодератор
Сообщений: 1359
Регистрация: 25.6.2006
Где: я?

Репутация: 3
Всего: 40



Модератор: Название темы должно отражать ее суть!

Это сообщение отредактировал(а) gambit - 2.6.2013, 22:54
PM MAIL ICQ Skype   Вверх
jonie
Дата 19.6.2013, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 6
Всего: 118



Цитата(gambit @  31.5.2013,  12:07 Найти цитируемый пост)

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

я добавлю простую фразу: XAML не позволяет делать байдинг напрямую к делегатам (в силу того что типов делегатов может быть много, но сами делегаты по сути своей могут иметь разные сигнатуры), поэтому эти делегнаты оборачиваются в некие классы, наследуемые от ICommand (вот к наследникам XAML умеет биндится) - в заглавном посте это как раз и показано - там делегат передается в конструктор.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
dzaraev
Дата 29.6.2013, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 12.1.2013

Репутация: 1
Всего: 1



Цитата(Alexstudent @  23.5.2013,  16:34 Найти цитируемый пост)
а вот что здесь происходит, по отдельности что то вроде понимаю а все вместе не допираю и с трудом представляю 

Происходит следующее: 
У класса 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
--------------------
Если вопрос решён - помечайте тему.  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0777 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.