Пропустите CommandParameter, чтобы командовать в Silverlight с помощью MVVM

StackOverflow https://stackoverflow.com/questions/4483086

Вопрос

Я просто изучаю Silverlight, смотрю на MVVM и команду.

Итак, я видел основную реализацию RelayCommand:

public class RelayCommand : ICommand
{
    private readonly Action _handler;
    private bool _isEnabled;

    public RelayCommand(Action handler)
    {
        _handler = handler;
    }

    public bool IsEnabled
    {
        get { return _isEnabled; }
        set
        {
            if (value != _isEnabled)
            {
                _isEnabled = value;
                if (CanExecuteChanged != null)
                {
                    CanExecuteChanged(this, EventArgs.Empty);
                }
            }
        }
    }

    public bool CanExecute(object parameter)
    {
        return IsEnabled;
    }

    public event EventHandler CanExecuteChanged;

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

Как я могу передать параметр вниз с командой, использующей это?

Я видел, что вы можете пройти CommandParameter как это:

<Button Command="{Binding SomeCommand}" CommandParameter="{Binding SomeCommandParameter}" ... />

В моем ViewModel мне нужно создать команду, но RelayCommand ожидает Action делегат. Могу ли я реализовать RelayCommand<T> с использованием Action<T> - Если так, как мне это сделать и как я его использовать?

Может ли кто-нибудь привести мне какие-либо практические примеры на CommandParameters с MVVM, которые не включают использование библиотек 3-й стороны (например, Light MVVM), так как я хочу полностью его понять, прежде чем использовать существующие библиотеки.

Спасибо.

Это было полезно?

Решение

public class Command : ICommand
{
    public event EventHandler CanExecuteChanged;

    Predicate<Object> _canExecute = null;
    Action<Object> _executeAction = null;

    public Command(Predicate<Object> canExecute, Action<object> executeAction)
    {
        _canExecute = canExecute;
        _executeAction = executeAction;
    }
    public bool CanExecute(object parameter)
    {
        if (_canExecute != null)
            return _canExecute(parameter);
        return true;
    }

    public void UpdateCanExecuteState()
    {
        if (CanExecuteChanged != null)
            CanExecuteChanged(this, new EventArgs());
    }

    public void Execute(object parameter)
    {
        if (_executeAction != null)
            _executeAction(parameter);
        UpdateCanExecuteState();
    }
}

Базовый класс для команд

И это ваше командное свойство в ViewModel:

 private ICommand yourCommand; ....

 public ICommand YourCommand
    {
        get
        {
            if (yourCommand == null)
            {
                yourCommand = new Command(  //class above
                    p => true,    // predicate to check "CanExecute" e.g. my_var != null
                    p => yourCommandFunction(param1, param2));
            }
            return yourCommand;
        }
    }

в xaml set привязывание с свойством команды, например:

 <Button Command="{Binding Path=YourCommand}" .../>

Другие советы

Может быть, эта статья объясняет, что вы ищете. У меня также была та же проблема всего несколько минут назад.

http://www.eggheadcafe.com/sample-code/silverlightwpffandxaml/76e6b583-edb1-4e23-95f6-7ad8510c0f88/pass-command-parameter-to-relaycommand.aspx

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top