2017-04-12 380 views
0

我正在使用MVVM,我在按鈕中定義了一個Command。我想在這個Command中使用一個參數,執行一個動作並證明Canexecute。WPF MVVM RelayCommand Action,canExecute,參數

我有這個RelayCommand

class RelayCommand<T> : ICommand 
    { 
     private readonly Action<T> _execute; 
     private readonly Func<T, bool> _canExecute; 

     /// <summary> 
     /// Initializes a new instance of the RelayCommand class that 
     /// can always execute. 
     /// </summary> 
     /// <param name="execute">The execution logic.</param> 
     /// <exception cref="ArgumentNullException">If the execute argument is null.</exception> 
     public RelayCommand(Action<T> execute) 
      : this(execute, null) 
     { 
     } 

     /// <summary> 
     /// Initializes a new instance of the RelayCommand class. 
     /// </summary> 
     /// <param name="execute">The execution logic.</param> 
     /// <param name="canExecute">The execution status logic.</param> 
     /// <exception cref="ArgumentNullException">If the execute argument is null.</exception> 
     public RelayCommand(Action<T> execute, Func<T, bool> canExecute) 
     { 
      if (execute == null)    
       throw new ArgumentNullException("execute"); 

      _execute = execute; 

      if (canExecute != null)    
       _canExecute = canExecute;    
     } 

     #region ICommand Members 

     public bool CanExecute(object parameter) 
     { 
      if (_canExecute == null)    
       return true; 

      if (parameter == null && typeof(T).IsValueType) 
       return _canExecute(default(T)); 

      return _canExecute((T)parameter);    
     } 

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

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

     #endregion 
    } 

使用此按鈕

<Button Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2" 
     Style="{StaticResource BotonSelect}" Width="200" 
     Command="{Binding ModificarLicenciaCommand}"       > 
     <Label Content="Modificar Licencia" /> 
</Button> 

並在視圖模式。

ModificarLicenciaCommand = new RelayCommand(ModificarLicencia, CanModificarLicencia); 

private bool CanModificarLicencia() 
{ 
    // Comprobar puedo modificar        
    return true; 
} 

private void ModificarLicencia() 
{ 
    // Modificar licencia 
} 

這是好的,但我想傳遞一個參數,並使用這樣的事情:

CommandParameter = 「{綁定的ElementName = DataGridLicencias}」

<Button Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2" 
    Style="{StaticResource BotonSelect}" Width="200" 
    Command="{Binding ModificarLicenciaCommand}" 
    CommandParameter="{Binding ., ElementName=DataGridLicencias}" > 
    <Label Content="Modificar Licencia" /> 
</Button> 

,並在視圖模型:

RelayCommand < SfDataGrid>

ModificarLicenciaCommand = new RelayCommand<SfDataGrid>(ModificarLicencia, CanModificarLicencia); 

private void ModificarLicencia(SfDataGrid dataGrid) 
{ 
    // Modificar licencia 
} 

編輯:

藉助於此,我在ModificarLicenciaCommand =新RelayCommand錯誤(ModificarLicencia,CanModificarLicencia)

在CanModificarLicentia ==>錯誤ARGUMENT2:無法從 '方法組' 轉換到'Func'

任何幫助?

+0

那麼,什麼是你的問題?你的命令似乎工作得很好。 – mm8

+0

我編輯帖子並顯示錯誤 – user1253414

回答

1

以下視圖模型實現應該工作:

public class ViewModel 
{ 
    public ViewModel() 
    { 
     ModificarLicenciaCommand = new RelayCommand<SfDataGrid>(ModificarLicencia, CanModificarLicencia); 
    } 

    private ICommand _modificarLicenciaCommand; 
    public ICommand ModificarLicenciaCommand 
    { 
     get { return _modificarLicenciaCommand; } 
     set { _modificarLicenciaCommand = value; } 
    } 

    private void ModificarLicencia(SfDataGrid dataGrid) 
    { 
     // Modificar licencia 
    } 

    private bool CanModificarLicencia(SfDataGrid dataGrid) 
    { 
     return true; 
    } 
} 
+0

這很完美,謝謝。 – user1253414

相關問題