locked
Передача параметров с RelayCommand (Win8.1/WP8.1) RRS feed

  • Общие обсуждения

  • Добрый день!

    Создаю небольшое универсальное приложения для Windows 8.1 и WP 8.1. Как и положено по паттерну MVVM хотел использовать команды. Использую класс RelayCommand<T> следующего содержания:

    public class RelayCommand<T> : ICommand
        {
            private readonly Action<T> _execute;
            private readonly Predicate<T> _canExecute;
    
            /// <summary>
            /// Создано при вызове RaiseCanExecuteChanged.
            /// </summary>
            public event EventHandler CanExecuteChanged;
    
            /// <summary>
            /// Создает новую команду, которая всегда может выполняться.
            /// </summary>
            /// <param name="execute">Логика выполнения.</param>
            public RelayCommand(Action<T> execute)
                : this(execute, null)
            {
            }
    
            /// <summary>
            /// Создает новую команду.
            /// </summary>
            /// <param name="execute">Логика выполнения.</param>
            /// <param name="canExecute">Логика состояния выполнения.</param>
            public RelayCommand(Action<T> execute, Predicate<T> canExecute)
            {
                if (execute == null)
                    throw new ArgumentNullException("execute");
                _execute = execute;
                _canExecute = canExecute;
            }
    
            /// <summary>
            /// Определяет, можно ли выполнить эту команду <see cref="RelayCommand"/> в текущем состоянии.
            /// </summary>
            /// <param name="parameter">
            /// Данные, используемые командой. Если команда не требует передачи данных, этот объект можно установить равным NULL.
            /// </param>
            /// <returns>true, если команда может быть выполнена; в противном случае - false.</returns>
            public bool CanExecute(object parameter)
            {
                return _canExecute == null ? true : _canExecute((T)parameter);
            }
    
            /// <summary>
            /// Выполняет <see cref="RelayCommand"/> текущей цели команды.
            /// </summary>
            /// <param name="parameter">
            /// Данные, используемые командой. Если команда не требует передачи данных, этот объект можно установить равным NULL.
            /// </param>
            public void Execute(object parameter)
            {
                _execute((T)parameter);
            }
    
            /// <summary>
            /// Метод, используемый для создания события <see cref="CanExecuteChanged"/>
            /// чтобы показать, что возвращаемое значение <see cref="CanExecute"/>
            /// метод изменился.
            /// </summary>
            public void RaiseCanExecuteChanged()
            {
                var handler = CanExecuteChanged;
                if (handler != null)
                {
                    handler(this, EventArgs.Empty);
                }
            } 
        }


    Создаю команду в ViewModel:

    private ICommand _myCommand;
    public ICommand MyCommand
    {
        get
        {
            if (_myCommand == null)
            { _myCommand = new RelayCommand<object>(this.MyCommand_Execute); }
            return _myCommand;
        }            
    }
    
    private async void MyCommand_Execute(object parameter)
    {
        MessageDialog msg = new MessageDialog(String.Format("Parameter: {0}", parameter));
        await msg.ShowAsync();
    }

    Присоединяю команду:

    <AppBarButton Icon="Add" Command="{Binding Path=ViewModel.MyCommand}"
                             CommandParameter="123"/>

    Все работает. В Parameter мне возвращается введенное значение (в данном случае 123).

    Но такой вариант команды мне совсем не подходит. Мне требуется, чтобы возвращалось значение, известное только во время выполнения.

    Делаю Binding в CommandParameter:

    CommandParameter="{Binding ElementName=itemsListView, Path=Items.Count}"

    И... ничего. Parameter имеет значение null.

    Что я делаю не так? Как мне передать параметр команды через Binding и благополучно его получить?


    20 мая 2014 г. 14:15

Все ответы

  • А отладчик что нибудь по этому поводу сообщает?
    20 мая 2014 г. 14:56
  • Совершенно ничего не сообщает. Просто null и все.

    Может быть в классе требуется какой-нибудь DependencyProperty?

    21 мая 2014 г. 13:12