C# mvvm light Messenger.Default.Register in View codebehind?

C# mvvm light Messenger.Default.Register in View codebehind?,c#,design-patterns,architecture,mvvm,mvvm-light,C#,Design Patterns,Architecture,Mvvm,Mvvm Light,在Mix11上展示的书架解决方案John Papa有些东西听起来有点奇怪。。。 它使用了一个MVVM模式和MVVM轻型工具包。。。一切都很好。 我唯一不能理解的是: 在视图的codebehind中,它注册了几条消息,下面是代码: public partial class BookView : Page { public BookView() { InitializeComponent(); //btnEdit.SetBinding(Button.I

在Mix11上展示的书架解决方案John Papa有些东西听起来有点奇怪。。。 它使用了一个MVVM模式和MVVM轻型工具包。。。一切都很好。 我唯一不能理解的是: 在视图的codebehind中,它注册了几条消息,下面是代码:

public partial class BookView : Page
{
    public BookView()
    {
        InitializeComponent();
        //btnEdit.SetBinding(Button.IsEnabledProperty, new Binding("User.IsAuthenticated") { Source = Application.Current.Resources["WebContext"] });
        Title = ApplicationStrings.HomePageTitle;
        RegisterMessages();
    }

    private void RegisterMessages()
    {
        Messenger.Default.Register<LaunchEditBookMessage>(this, OnLaunchEditBook);
        Messenger.Default.Register<SavedBookDialogMessage>(this, OnSaveBookDialogMessageReceived);
    }

    private void OnLaunchEditBook(LaunchEditBookMessage msg)
    {
        var editBook = new EditBookWindow();
        editBook.Show();
    }

    private void OnSaveBookDialogMessageReceived(SavedBookDialogMessage msg)
    {
        MessageBox.Show(msg.Content, msg.Caption, msg.Button);
    }
//...

是的,在他的例子中,这看起来像一个bug。他可能不希望页面在应用程序中被实例化多次。登记有一个方法:<代码>信使。默认。注销< /代码>可以挂起一个卸载事件来修复这个问题(您可以考虑将寄存器移动到代码>加载< /代码>。< /P> 但是,我理解他为什么将事件放在视图中。他正在打开一个新窗口并调用MessageBox.Show(),因为这些事件与视图紧密耦合,所以他将它们保留在视图中。我个人仍然不喜欢这个解决方案


其他MVVM框架更好地解决了这个问题,例如。它有很多帮助类可以从您的ViewModel中执行类似视图的操作。Caliburn可以100%消除代码中的任何内容,但它有一个相当大的学习曲线。

这就是为什么我们在我的工作中使用Caliburn,但是Caliburn.Micro可能是一个不错的选择:。我也有这里是一个MVVM框架:但它正在与另一个框架合并:
<sdk:Page Loaded="Page_Loaded" Unloaded="Page_Unloaded">
private void Page_Loaded(object sender, RoutedEventArgs e)
    {
        RegisterMessages();
    }

    private void Page_Unloaded(object sender, RoutedEventArgs e)
    {
        Messenger.Default.Unregister(this);
    }