Как передать CommandParameters для ViewModel? - PullRequest
0 голосов
/ 26 февраля 2012

У меня есть команда, которая должна переключать текущий вид при его выполнении. Я связал эту команду со своими кнопками так:

<Button Style="{StaticResource TextButton}" Command="{Binding ViewModel:MainViewModel.OpenItemCommand}" CommandParameter="{Binding Link}"/>

Я хочу передать Link (ссылку на текущую статью) моей команде. Моя команда определена так:

public class Command : ICommand
{
    public event EventHandler CanExecuteChanged;

    readonly Predicate<Object> _canExecute;
    readonly Action<Object> _executeAction;

    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 у меня есть это:

public ICommand OpenItemCommand
{
    get
    {
        if (_openItemCommand == null)
        {
            _openItemCommand = new Command.Command(
                p => true,
                p => OpenItem(_HOW_DO_I_GET_THE_PARAMETER?_)
            );
        }
        return _openItemCommand;
    }
    set 
    {
        if (_openItemCommand != value)
        {
            _openItemCommand = value;
            RaisePropertyChanged("OpenItemCommand");
        }
    }
}

private void OpenItem(Uri link)
{
    throw new NotImplementedException();
}

Когда я создаю команду, мне нужно передать параметр команды (ссылку) в метод Execute. Но как мне получить ценность этого? Я определил CommandParameter в XAML, но я не знаю, как получить к нему доступ.

Я действительно просмотрел огромное количество веб-сайтов, но не могу найти ответ.

Ответы [ 2 ]

1 голос
/ 26 февраля 2012

Вы должны посмотреть на реализацию Prist's DelegateCommand или MVLM light RelayCommand.С их помощью вы бы написали код, подобный следующему:

public class ViewModel
{
    public ViewModel()
    {
        OpenItemCommand = new RelayCommand<string>(OpenItem);
    }

    public RelayCommand<string> OpenItemCommand { get; private set; }

    private void OpenItem(string link)
    {
        Debug.WriteLine(link);
    }
}

, где string в данном случае - это тип параметра.

Я не уверен, откуда поступает параметр ссылкино если это элемент управления, значение элемента управления может быть привязано к свойству модели представления, тогда вам не нужен параметр, например:

public class ViewModel
{
    public ViewModel()
    {
        OpenItemCommand = new RelayCommand(OpenItem);
    }

    public RelayCommand OpenItemCommand { get; private set; }

    public string Link { get; set; }

    private void OpenItem()
    {
        Debug.WriteLine(Link);
    }
}
1 голос
/ 26 февраля 2012

заменить

 p => OpenItem(_HOW_DO_I_GET_THE_PARAMETER?_)

с

 p => OpenItem(p)

это то, что означает p: параметр

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...