2015-10-07 170 views
0

我有以下情况下,我希望能找到一个解决方案,我有一个自定义Window类,我创建了一个事件如下(我已经删除了一些代码简洁)mvvm绑定自定义事件与自定义窗口与viewmodel

public class AeroWindow : Window 
{ 
    public delegate void SystemMenuEventHandler(object sender); 
    public event SystemMenuEventHandler Exit; 

    ... 

    public override void OnApplyTemplate() 
    { 
     ... 
     var exitButton = this.GetTemplateChild("SM_ExitButton") as Button; 
     if (exitButton != null) 
     { 
      exitButton.Click += (sender, args) => { this.OnExit(); }; 
     } 
    } 

    protected virtual void OnExit() 
    { 
     if (this.Exit != null) 
     { 
      this.Exit(this); 
     } 
    } 
} 

我使用MVVM与Calibutn.Micro和我有一个ShellViewModel和ShellView(该ShellView从AeroWindow继承)

我想知道的是以下几点:

  • 我应该如何正确地创建自定义事件,是否正确?
  • 我如何然后结合所述“事件”在视图模型
  • 能事件的方法相同的方法被用于气泡从一个视图模型的事件到另一个(例如我有最初加载一个LoginViewMode的ShellViewModel (UserControl),然后加载一个MainViewModel(UserControl),如果我在窗口上有一个名为Exit的事件,那么ShellViewModel可以订阅该消息并将其展开到加载的视图或应该加载的视图订阅窗口事件)

我知道这是一些问题,但它们都与同一件事有关,我希望有人能提供答案。

+0

为什么要将退出事件绑定到viewmodel?视图模型是否需要知道您正在退出应用程序? – Lance

+0

退出只是一个例子,显然AeroWindow会处理退出,将会有其他事件我想要创建和绑定 –

回答

1

让我试着来回答你的每一个问题

我应该如何正确地创建自定义事件,是上述正确的吗?

  • 我认为你没有以上是正确的,或者你可以添加一个事件处理程序一样平常。
  • 如果您正在讨论的是自定义事件,您将在其中创建自己的事件,而不是从某个类的内置事件中创建事件,那么实际上您可以在类中创建一个delegate and an event

我如何再结合所述“事件”中的视图模型

  • 要绑定的事件,我不认为,你想要做什么是绑定命令。您可以尝试阅读ICommand,Relaycommand, DelegateCommand。您可以在您的 视图模型中创建一个ICommand属性,然后将其绑定到该按钮的Command属性。有 也有一些工具,使您可以绑定到事件,试图寻找 为提供EventToCommand

一些库可以将事件的同样的方法可以用来泡的事件从一个视图模型到另一个(例如我有ShellViewModel最初加载一个LoginViewMode(UserControl),然后加载一个MainViewModel(UserControl),如果我有一个窗口上的事件称为退出可以ShellViewModel订阅并将其泡泡到加载的视图或应该加载的视图订阅窗口事件)

  • 在这种情况下,由于您使用的是caliburn.micro,因此涉及两个viewmodel,因此您可能需要检查
    EventAggregator。这将允许您从
    一个视图模型发布事件并在另一个视图模型上订阅。然后,一旦发布被调用,所有用户将被通知。