2016-11-04 2 views
0

Я использую сетку MVC Kendo UI, и я хочу инкапсулировать шаблонный код, поэтому мне не нужно дублировать один и тот же код на каждой сетке. Настройка команд на сетке выглядит следующим образом:Как я могу предоставить выражение по умолчанию в {} выражения лямбда, сохраняя при этом его добавление?

columns.Command(command => 
      { 
       command.Custom("Edit").Text("<span class='k-icon k-edit'></span>").Click("editRecord"); 
       command.Custom("Delete").Text("<span class='k-icon k-i-delete'></span>").Click("deleteItem"); 
      }).Width(130); 

Редактирование и удаление является шаблонными, однако есть потенциал для дополнительных пользовательских команд в зависимости от сетки. Тип команды лямбда для команды: Action<GridActionCommandFactory<T>>. Как я могу абстрагироваться от шаблона к методу или чему-то еще, позволяя вводить пользовательские команды? Псевдопользователей-кодирования это я полагаю, что это будет выглядеть примерно так:

columns.Command(command => 
      { 
       //Custom commands here 
       SomeConfigClass.DefaultGridCommands(command); 
       //Custom commands here 
      }).Width(130); 

или, может быть:

columns.Command(command => 
      { 
       //Custom commands here 
       command.DefaultCommands(); 
       //Custom commands here 
      }).Width(130); 

И это будет включать редактировать и удалять команды. Но я понятия не имею, как изменить лямбда-выражение таким образом, как я могу это достичь?

+0

Какой тип параметра 'command' здесь' columns.Command (command => '? I.e.' Action > ' –

+0

Не имеет значения, я понял это. – SventoryMang

ответ

0

Ну, я сделал еще несколько копаний, и это закончилось тем, что не было так тяжело. Не уверен, если это самое элегантное решение, но я сделал это так:

public static Action<GridActionCommandFactory<T>> GetDefaultGridCommands<T>(Action<GridActionCommandFactory<T>> customCommandsBeforeDefault = null, Action<GridActionCommandFactory<T>> customCommandsAfterDefault = null) where T : class 
    { 
     Action<GridActionCommandFactory<T>> defaultCommands = x => 
     { 
      x.Custom("Edit").Text("<span class='k-icon k-edit'></span>").Click("editRecord"); 
      x.Custom("Delete").Text("<span class='k-icon k-i-delete'></span>").Click("deleteItem"); 
     }; 

     List<Action<GridActionCommandFactory<T>>> actions = new List<Action<GridActionCommandFactory<T>>>(); 

     if(customCommandsBeforeDefault != null) 
      actions.Add(customCommandsBeforeDefault); 
     actions.Add(defaultCommands); 
     if(customCommandsAfterDefault != null) 
      actions.Add(customCommandsAfterDefault); 

     Action<GridActionCommandFactory<T>> combinedAction = (Action<GridActionCommandFactory<T>>) Delegate.Combine(actions.ToArray()); 

     return combinedAction; 
    } 

Затем назвав его в сетке:

columns.Command(KendoUiGridConfig.GetDefaultGridCommands<MyViewModel>()).Width(130); 

Метод Delegate.Combine было то, что я искал.

Смежные вопросы