Question

Je suis en train d'apprendre Silverlight et regarder MVVM et commandant.

Ok, donc je l'ai vu la mise en œuvre de RelayCommand de base:

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

Comment puis-je passer un paramètre vers le bas avec une commande en utilisant ce?

J'ai vu que vous pouvez passer un CommandParameter comme ceci:

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

Dans mon ViewModel, je dois créer le commandement, mais RelayCommand attend un délégué de Action. Puis-je mettre en œuvre à l'aide RelayCommand<T> Action<T> - si oui, comment dois-je faire et comment je l'utilise

Quelqu'un peut-il me donner des exemples pratiques sur CommandParameters avec MVVM qui ne nécessitent pas l'utilisation de bibliothèques 3e partie (par exemple MVVM Light) que je veux comprendre avant d'utiliser les bibliothèques existantes.

Merci.

Était-ce utile?

La solution

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

est la classe de base pour les commandes

Et ceci est votre commande dans la propriété 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 définit la reliure à commande comme propriété:

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

Autres conseils

Peut-être que cet article explique ce que vous cherchez. J'ai eu le même problème il y a quelques minutes.

scroll top