Простая обработка событий в MVVM - PullRequest
9 голосов
/ 18 декабря 2009

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

Пример:

<MediaElement
     MediaOpened={Binding SomeEventHandler} />

В этом случае мы хотим обработать событие MediaOpened в ViewModel. Без фреймворка, такого как Prism, как можно связать это с ViewModel?

Ответы [ 4 ]

12 голосов
/ 18 декабря 2009

Командование - ваш SomeEventHandler должен быть классом, реализующим ICommand ... в Интернете имеется куча литературы ...

Также - я хотел бы рассмотреть вопрос о получении бесплатной, легкой «мини» инфраструктуры MVVM, такой как MvvmFoundation , которая предоставляет RelayCommand именно для этой цели (без сложности / накладных расходов при обучении PRISM)

EDIT:

Взгляните на этот блог для прикрепления команды к любому событию ... Как я уже говорил, он невероятно мощный, но я полагаю, что вам нужно сделать суждение, если вы этого хотите по сравнению с чем-то вроде присоединения старомодного события и использования сверхтонкого обработчика событий в вашем коде, который просто вызывает некоторый метод в вашей ViewModel, что-то вроде:

public void SomeEventHandler(object sender, SomeEventArgs e)
{
    MyViewModel vm = (MyViewModel)this.DataContext;
    vm.HandleLoadEvent( );
}

прагматичный против Лучшей практики ... Я оставлю это с вами;)

4 голосов
/ 18 декабря 2009

Взгляните на прикрепленное командное поведение Марлона Греча .Это облегчает привязку событий к командам ViewModel

0 голосов
/ 01 июля 2011

Небольшой и открытый исходный код ImpromptuInterface.MVVM фреймворк с синтаксисом привязки событий и использованием dlr в .net 4.0. Хотя этот пример требует создания подкласса ImpromptuViewModel. Свойство привязки события не зависит от этого конкретного типа модели представления, а поставщик привязки события является открытым.

 <Window x:Class="MyProject.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:MVVM="clr-namespace:ImpromptuInterface.MVVM;assembly=ImpromptuInterface.MVVM" Title="MainWindow" Height="600" Width="800">

  <MediaElement MVVM:Event.Bind="{Binding Events.MediaOpened.To[MediaElement_MediaOpened]}"  />

...

public class MyViewModel{

    public dynamic Events
    {
        get { return new EventBinder(this); }
    }

    public void MediaElement_MediaOpened(MediaElement sender,   RoutedEventArgs e){
         ...
    }
}
0 голосов
/ 18 декабря 2009

MediaOpened является событием и не поддерживает привязку команд.

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

Для привязки к модели представления добавьте свойство, которое реализует ICommand. На рисунке 3 в этой статье журнала MSDN показан RelayCommand, который является полезной реализацией ICommand. RelayCommand инициализируется делегатом для подключения к вашей модели представления.

http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

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