使用MVVM Light Messenger代替事件

时间:2015-02-25 19:50:30

标签: c# wpf xaml mvvm mvvm-light

我正在使用MVVM Light作为我当前的WPF项目,我想知道何时应该使用MVVM Light的消息传递而不是WPF事件。

WPF活动:

MyControl.xaml

<ListView SelectionChanged="ListView_OnSelectionChanged" />

MyControl.cs

private MyViewModel ViewModel
{
    get { return this.DataContext as MyViewModel; }
}

private void ListView_OnSelectionChanged( object sender, SelectionChangedEventArgs e )
{
    this.ViewModel.ListViewSelectionChanged( ( (ListView) sender ).SelectedItems );
}

MVVM Light Messaging:

MyControl.cs

private void ListView_OnSelectionChanged( object sender, SelectionChangedEventArgs e )
{
    Messenger.Default.Send( new ListViewSelectionMessage {SelectedItems = ((ListView)sender).SelectedItems} );
}

ListViewSelectionMessage.cs

public class ListViewSelectionMessage
{
    public IList SelectedItems { get; set; }
}

MyViewModel

public class MyViewModel
{
    MyViewModel()
    {
        Messenger.Default.Register<ListViewSelectionMessage>(this, this.ListViewSelectionChaged);
    }

    private void ListViewSelectionChaged( ListViewSelectionMessage message )
    {
        // ...
    }
}

因为使用Messanger一切都很容易脱钩我很想在任何地方使用Messanger。使用Messanger而不是事件有什么不对吗?或者这会产生我不知道的问题。谢谢!

1 个答案:

答案 0 :(得分:3)

通常,任何MVVM框架(Prism,MVVM Light)中的消息都是使用插件体系结构在应用程序中松散耦合的组件之间进行通信的好方法,因为您可以通过共享库中声明的契约将消息从一个模块发送到另一个模块。在单独开发应用程序或在小团队高技能程序员中开发应用程序时,可以使用它。

否则有一个主要的缺点:重构和调试非常困难,因为你不能只是点击消息和“找到用法”你需要先签订合同(Interface)而不是“find usages”,然后使用Subscribe / Register指令可视地查找位置。此外,通常开发人员忘记取消订阅消息,因此您将面临问题,而从一个模块发送并打算在同一模块中处理的消息将在其他模块中被错误处理,因此会导致意外行为并产生许多痛苦的错误。

以上所有内容均基于我的个人经验,因此结果可能会有所不同。请小心留言,它会很好地为您服务。另外在我看来,作为事件替换的消息有点开销/过度工程,因为当你有紧密耦合的组件时你并不需要它。