2015-10-07 167 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。這將允許您從
    一個視圖模型發佈事件並在另一個視圖模型上訂閱。然後,一旦發佈被調用,所有用戶將被通知。