2016-05-19 4 views
2

Мне нужна помощь, чтобы понять, что представляют делегаты, и если я использовал ее в своей программе. Я использую класс RelayCommand, который я нашел в другом столбце, чтобы реализовать мои команды.RelayCommand и делегаты, пытаясь понять делегатов

RelayCommand:

public class RelayCommand : ICommand 
{ 
    readonly Action<object> _execute; 
    readonly Func<bool> _canExecute; 

    public RelayCommand(Action<object> execute, Func<bool> canExecute = null) 
    { 
     if (execute == null) 
      throw new ArgumentNullException(nameof(execute)); 

     _execute = execute; 
     _canExecute = canExecute; 
    } 

    public bool CanExecute(object parameter) 
    { 
     return _canExecute == null || _canExecute.Invoke(); 
    } 

    public event EventHandler CanExecuteChanged 
    { 
     add { CommandManager.RequerySuggested += value; } 
     remove { CommandManager.RequerySuggested -= value; } 
    } 

    public void Execute(object parameter) 
    { 
     _execute(parameter); 
    } 
} 

В конструкторе моего ViewModel, я делаю это:

public ICommand SearchCommand { get; set; } 

//Constructor 
public BookingViewModel() 
{ 
    SearchCommand = new RelayCommand(SearchCommand_DoWork,() => true);  
} 

public async void SearchCommand_DoWork(object obj) 
{ 
    //Code inside this method not shown 
} 

Я знаю, что делегат является типом, который инкапсулирует метод. Вы можете написать делегат, как это:

public delegate int MethodName(string name) 

Если делегат герметизирующего метода имяМетод, который имеет тип возвращаемого междунара и принимает параметр строки.

Означает ли это, что есть делегат, созданный при использовании ICommand, как показано в коде? Если метод инкапсуляции «SearchCommand_DoWork»

Надеюсь, что некоторые могут убрать некоторые вещи для меня.

ответ

2

Означает ли это, что есть делегат, созданный при использовании ICommand, как показано в коде? Где метод инкапсуляции «SearchCommand_DoWork»

Вы создаете новый объект типа RelayCommand. Как вы можете видеть в конструкторе класса, вы передаете объект Action (делегат, который не возвращает значения) и объект Func (делегат, который возвращает значение).

Для делегата Action вы передаете объект, который инкапсулирует функцию void SearchCommandDoWork, для объекта Func, который вы передаете в лямбда-функцию, которая не принимает параметр и всегда возвращает true.

Делегат Action инкапсулирует вашу функцию SearchCommand_DoWork (делегат в основном является указателем безопасной функции типа).

Оба действия и Func являются предопределенными делегатами. Вы также можете определить своих собственных делегатов, что является то, что

public delegate int MethodName(string name) 

.

+0

Спасибо за ваш ответ, он действительно прояснил некоторые вещи о делегатах. – Mikkel