2017-04-12 374 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

相关问题