повесить обработчик на обработчик событий в представлении - PullRequest
0 голосов
/ 05 апреля 2011

Я хочу добавить событие в мой обработчик событий.Проблема в том, что мой EventHandler находится в моей ViewModel, а мое событие находится в представлении.Как я могу получить доступ к своей ViewModel из View, чтобы повесить это событие?

спасибо за вашу помощь

Ответы [ 2 ]

1 голос
/ 05 апреля 2011

Обычно в MVVM, когда View хочет отложить некоторую операцию до ViewModel, он делает это путем привязки к ICommand. По сути, это та же модель использования, что и в случае с событием, поскольку представление «отправляет» уведомление в ViewModel.

В зависимости от характера события я бы посоветовал вам заняться этим с помощью ICommand, поскольку:

  • Вся идея MVVM заключается в том, чтобы ViewModel не предполагал, что View является "реальным" пользовательским интерфейсом
  • Обычно, однако, View является реальным пользовательским интерфейсом (поэтому упомянутое вами событие, вероятно, связано с чем-то, происходящим в пользовательском интерфейсе)

Это заставляет меня думать, что вы ищете способ подписки ViewModel на событие пользовательского интерфейса из View, что противоречило бы принципу MVVM.

В вашем случае проблематично вызывать команду из ViewModel?

1 голос
/ 05 апреля 2011

Поскольку модель представления установлена ​​как DataContext представления, вы можете подписаться на DataContextChanged представления, и в обработчике приведите DataContext к типу модели представления и присоедините нужный обработчик события. Примерно так:

public class MyView : UserControl
{
   public MyView()
   {
       InitializeComponent();

       DataContextChanged += OnDataContextChanged;
   }

   private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs e)
   {
      MyViewModel viewModel = DataContext as MyViewModel;

      if (viewModel != null) 
      {
          viewModel.MyEvent += OnMyEvent;
      }
   }
}
...