Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Использование команд


Автор: Alexstudent 23.5.2013, 16:34
Вот нашел в инете образец кода, по обработке события нажатия кнопки. Приложение то было написано с на 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
    }
}

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

Автор: 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
Модератор: Название темы должно отражать ее суть!

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

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

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

Автор: dzaraev 29.6.2013, 12:04
Цитата(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, либо - выкручивайтесь как хотите.
А выкручиваются в данной ситуации с помощью http://msdn.microsoft.com/ru-ru/library/ms749011.aspx. Есть множество подходов к написанию так называемых behavior'ов, но они как правило индивидуально делаются под конкретные задачи. http://zamjad.wordpress.com/2011/06/07/convert-event-into-command-in-mvvm-model/.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)