2014-02-07 69 views
0

我知道在MVVM中,我們不應該在視圖之間使用viewModel,但我的應用程序需要它。所以,我有 如何在兩個或更多視圖中共享單個Viewmodel?

說LinkView和LinkViewModel

在LinkWindow構造一個視圖,視圖模型對應

public LinkWindow(string path) 
{ 
    InitializeComponent(); 
    LinkViewModel vm = new LinkViewModel(path); 
    this.DataContext = vm;  
} 

所以LinkWindow及其corrosponding LinkViewModel是初始化。現在,在LinkWindow我有一個按鈕,將彈出一個多窗口(在需要時),但我需要相同的視圖模型實例(VM)

按鈕工具命令"LinkEmailCommand"

LinkEmailCommand = new Command(DoEmailCommand, false); 

LinkViewModel

private void DoEmailCommand() 
{ 
    var EmailWindow = new EmailWindow(); 
    EmailWindow.Show(); 
} 

此EmailWindow不使用已經初始化的LinkViewModel。我怎麼做?

編輯 - 解決方案:

那麼,有什麼解決辦法是通過在構造函數「這個」

LinkViewModel

private void DoEmailCommand() 
{ 
    var EmailWindow = new EmailWindow(this); 
    EmailWindow.Show(); 
} 

然後在LinkWindow通過視圖模型對象中的一個構造函數

public LinkWindow(LinkViewModel vm) 
     { 
      InitializeComponent(); 
      Title = FilrUI.Properties.Resources.ShareFilrEmail; 
      this.DataContext = vm; 
     } 

這就是現在所有的單一可以在兩個視圖中使用視圖模型的立場。

回答

1

在其他類,創建視圖模型,然後將它傳遞到這兩個觀點的構造函數的:)在第二視圖

public LinkWindow(string path, object viewModel) 
{ 
    InitializeComponent(); 
    this.DataContext = viewModel;  
} 

同樣的方式。只需使用相同的viewModel對象實例

+0

Viewmodel初始化是在linkWindow.cs文件和LinkWindow.DataContext = vm中完成的;現在如何在DoEmailCommand()的命令中啓動ViewModel? – Debhere

+0

因此,將當前(已初始化)的ViewModel傳遞給您的第二個視圖 var EmailWindow = new EmailWindow(this); EmailWindow.Show(); 並在EmailWindow的構造函數將其傳遞給DataContext屬性 – Koscik

+1

謝謝,它完美的作品,我已更新我的代碼,以便其他人會受益。 – Debhere

1

EmailWindow添加屬性ViewModel。然後,只需做你的命令處理程序:

private void DoEmailCommand() 
{ 
    var EmailWindow = new EmailWindow(); 
    EmailWindow.ViewModel = vm; 
    EmailWindow.Show(); 
} 

當然,你還需要重構你的LinkWindow有VM作爲一個字段。像這樣:

// Field for the viewmodel 
private LinkViewModel vm; 

public LinkWindow(string path) 
{ 
    InitializeComponent(); 
    vm = new LinkViewModel(path); 
    this.DataContext = vm;  
} 
+0

什麼是該屬性ViewModel? LinkViewModel的權利?確定,但LinkWindow及其初始化在構造函數中完成。它在View.cs中不在ViewModel中 – Debhere

+0

是的ViewModel類型應該是LinkViewModel。初始化發生的地方並不重要。你有所有必要的參考可供你使用。所以給你的代碼示例,你應該能夠得到它的工作。如果您無法將視圖和視圖模型.cs文件發佈爲您的問題的編輯。這樣我們就能給你一個更好的答案。 – Alex

+0

如果我寫公共LinkWindow(字符串路徑) InitializeComponent(); vm = new LinkViewModel(path); this.DataContext = vm; LinkViewModel,First InitializeComponent()中的第一個參數 }。顯示錯誤,然後在LinkWindow中我們傳遞一個LinkViewModel的新實例,但我想要相同的實例。 – Debhere

2

我知道MVVM我們不應該使用視圖模型翻過

你爲什麼這麼認爲的看法? 這是一個非常普遍的做法 - 有多種方式來表示相同的數據。

private void DoEmailCommand() 
{ 
    // do not do this! 
    var EmailWindow = new EmailWindow(); 
    EmailWindow.Show(); 
} 

您不應該從視圖模型創建視圖。這會消除MVVM的好處之一 - 代碼可測試性,並在視圖模型和視圖之間引起緊密耦合。考慮使用服務或事件聚合器來顯示新的視圖。

我該怎麼做?

顯然,兩個視圖需要相同的視圖模型實例。您可以做的最簡單的事情是將視圖模型實例傳遞給EmailWindow構造函數,或者通過該屬性爲EmailWindow分配視圖模型。

相關問題