Передать параметр с командой в viewmodel

у меня возникли проблемы с отправкой параметра из моего представления в мою viewmodel.

вид.в XAML:

на мой взгляд, у меня есть следующие:

<TextBox
    MinWidth="70"
    Name="InputId"/>

<Button 
    Command="{Binding ButtonCommand}"
    CommandParameter="{Binding ElementName=InputId}"
    Content="Add"/>

вид.код XAML.cs:

public MyView()
{
    InitializeComponent();
}

public MyView(MyViewModel viewModel) : this()
{
    DataContext = viewModel;
}

MyViewModel.cs:

public class MyViewModel : BindableBase
{
    public ICommand ButtonCommand { get; private set; }

    public MyViewModel()
    {
        ButtonCommand = new DelegateCommand(ButtonClick);
    }

    private void ButtonClick()
    {
        //Read 'InputId' somehow. 
        //But DelegateCommand does not allow the method to contain parameters.
    }
}

любые предложения, как я могу пройти InputId когда я нажимаю кнопку на мою viewmodel?

2 ответов


вам нужно добавить <object> к вашей команде делегата, как это:

public ICommand ButtonCommand { get; private set; }

     public MyViewModel()
        {
            ButtonCommand = new DelegateCommand<object>(ButtonClick);
        }

        private void ButtonClick(object yourParameter)
        {
            //Read 'InputId' somehow. 
            //But DelegateCommand does not allow the method to contain parameters.
        }

вы хотите, чтобы текст textbox изменил ваш xaml на:

CommandParameter="{Binding Text,ElementName=InputId}" 

для правильной реализации ICommand / RelayCommand посмотрите на это MSDN страница.

резюме:

public class RelayCommand : ICommand
{
    readonly Action<object> _execute;
    readonly Func<bool> _canExecute;

    public RelayCommand(Action<object> execute)
        : this(execute, null)
    {
    }

    public RelayCommand(Action<object> execute, Func<bool> canExecute)
    {
        if (execute == null)
            throw new ArgumentNullException("execute");

        _execute = execute;
        _canExecute = canExecute;
    }


    public bool CanExecute(object parameter)
    {
        return _canExecute == null || _canExecute.Invoke();
    }

    public event EventHandler CanExecuteChanged
    {
        add { CommandManager.RequerySuggested += value; }
        remove { CommandManager.RequerySuggested -= value; }
    }

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

} 


public MyViewModel()
{
    ButtonCommand = new RelayCommand(ButtonClick);
}

private void ButtonClick(object obj)
{
    //obj is the object you send as parameter.
}