Silverlight MVVM: куда делся мой (отправитель объекта, RoutedEventArgs e)? - PullRequest
2 голосов
/ 03 января 2011

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

XAML

            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <i:InvokeCommandAction Command="{Binding mvvmButtonclick}" />

                </i:EventTrigger>
            </i:Interaction.Triggers>

код модели представления

   public ICommand mvvmButtonclick
    {
        get;
        private set;
    }

Код конструктора Viewmodel для подключения команды

this.mvvmButtonclick = new ActionCommand(this.ButtonClickedEvent);

Фактический метод в модели представления, который вызывается при нажатии кнопки

   private void ButtonClickedEvent()
    {
        MessageBox.Show("worked!!!");
    }

Это работает.Итак, мои вопросы:

  • Это правильный путь?
  • Есть ли способ, которым я могу распространить параметры (отправитель объекта, RoutedEventArgs e) в моей модели представления, и если мне нужно, еслиего там нет?
  • Предположим, если это событие выбора из измененного списка, а не нажатие кнопки.Как получить значение выбранного элемента без отправителя объекта , параметров SelectionChangedEventArgs e ?

Ответы [ 2 ]

3 голосов
/ 04 января 2011

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

Цель триггеров взаимодействия - позволить конструктору (обычно использующему Blend) вызывать команду в модели представления. Какой элемент пользовательского интерфейса и какое событие в элементе пользовательского интерфейса может вызывать такую ​​команду - это выбор конструкторы .

Если ViewModel требует, чтобы во время такого вызова команды была предоставлена ​​конкретная производная от EventArgs, это немного связало бы разработчиков. Это создало бы связь между представлением и моделью представления, которую триггеры взаимодействия стремятся устранить.

Что касается вашего последнего вопроса, то способ определения текущего выбранного элемента в списке и уведомления об его изменении заключается в создании свойства модели представления, которое привязано к SelectedItem элемента ListBox. Для такого рода вещей не требуется триггеров или команд взаимодействия сотрудников.

2 голосов
/ 03 января 2011

Существуют некоторые фреймворки (такие как Catel), которые позволяют пересылку EventArgs.Например, посмотрите эту реализацию:

http://catel.codeplex.com/SourceControl/changeset/view/508b404f2c57#src%2fCatel.Windows35%2fMVVM%2fCommands%2fCommand.cs

Этот класс совместим как с Silverlight, так и с WPF.

Если вы не хотите использовать EventArgs, выпотребуется создать свойство SelectedObject в ViewModel и связать его с SelectedItem списка.

Catel включает 2 примера приложений (как в WPF, так и в Silverlight), которые используют MVVM и класс EventToCommand для редактирования выбранного элемента.в списке.Я думаю, это то, что вы ищете!

...