Domanda

sto solo imparando Silverlight e guardando MVVM e Comandante.

Ok, così ho visto l'implementazione di base 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();
    }
}

Come posso passare un parametro giù con un comando utilizzando questo?

Ho visto che è possibile passare un CommandParameter in questo modo:

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

Nel mio ViewModel, ho bisogno di creare il comando, ma RelayCommand si aspetta un delegato Action. Posso implementare RelayCommand<T> usando Action<T> -? Se sì, come faccio e come lo uso ad esso

qualcuno può darmi eventuali esempi pratici su CommandParameters con MVVM che non coinvolgono utilizzando le librerie di terze parti (ad esempio MVVM Light) come voglio capire fino in fondo prima di utilizzare librerie esistenti.

Grazie.

È stato utile?

Soluzione

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();
    }
}

è la classe base per i comandi

E questa è la tua proprietà Comando in 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;
        }
    }

in XAML di impostare la rilegatura a Command proprietà come:

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

Altri suggerimenti

Forse questo articolo spiega quello che stai cercando. Ho anche avuto lo stesso problema a pochi minuti fa.

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top