【问题标题】:WPF MVVM RelayCommand Action, canExecute, parameterWPF MVVM RelayCommand Action, canExecute, 参数
【发布时间】:2017-04-12 14:37:23
【问题描述】:

我正在使用 MVVM,我在按钮中定义了一个命令。我想在这个命令中使用一个参数,执行一个动作并证明是否可以执行。

我有这个 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="{Binding 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>

在 viewModel 中:

RelayCommandSfDataGrid >

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

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

编辑:

这样,我在 ModificarLicenciaCommand = new RelayCommand(ModificarLicencia, CanModificarLicencia) 中有一个错误

在 CanModificarLicentia ==> 错误参数 2:无法从“方法组”转换为“功能”

有什么帮助吗?

【问题讨论】:

  • 那么您的问题是什么?您的命令似乎运行良好。
  • 我已编辑帖子并显示错误

标签: wpf command relaycommand


【解决方案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;
    }
}

【讨论】:

  • 完美,谢谢。
【解决方案2】:

例如,您有一个 Button 和一个 TextBox。 只有当文本框的文本不为空时,按钮才会启用: 在查看

<TextBox Name="txtCondition" Width="120" Height="35"/>
<Button Width="120" Height="35" Content="Click me!" Command="{Binding YourICommand}" CommandParameter="{Binding ElementName=txtCondition,Path=Text}">

ViewModel中:

public ICommand YourICommand { get; set; }
YourICommand = new RelayCommand<string>((str) =>
              {
                 MessageBox.Show(str);
              },(str) => { return !string.IsNullOrEmpty(str); });

享受您的代码!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-26
    • 2014-09-29
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 2023-04-03
    • 2013-02-10
    • 1970-01-01
    相关资源
    最近更新 更多