2016-11-20 52 views
1

我有3個ViewModels,讓我們說說ViewModelA,ViewModelB和ViewModelC。 每個視圖模型都有相應的視圖。MVVM共享事件

在ViewModelA我有一個公共事件,我正在使用發送一些信息。

我希望ViewModelB和ViewModelC訂閱ViewModelA的當前/運行實例中的那個事件?

我該怎麼做? 如果一個新的ViewModelA我將有一個不同的ViewModelA實例,所以我需要參考當前的ViewModelA ...

注意:我沒有使用MVVM Light或其他框架(還沒有),因爲我沒有學習他們,但:) 謝謝。

回答

1

如果要創建從ViewModelA的視圖中的新觀點,你可以參考傳遞給這樣

var viewModelA = DataContext as ViewModelA; 
var newWindow = new ViewB(viewModelA); 

另一種觀點認爲那麼你就需要有一個屬性在ViewModelB

public ViewModelA MyViewModelA { get; set; } 

而在新的觀點:

public ViewB(ViewModelA viewModelA) 
{ 
    InitializeComponents(); 
    var viewModelB = DataContext as ViewModelB; 
    viewModelB.MyViewModelA = viewModelA; 
} 

然後你就可以通過MYV訪問ViewModelA iewModelA。

我一直這樣做,並沒有看到任何問題到目前爲止。

+0

謝謝,但我想避免這樣的代碼,我使用MEF導入/導出我的MainViewModel DataContext,然後我使用ViewModelLocator從WPF DataTemplates解析DataContext /視圖。不管怎樣,謝謝你。 –

1

1)你可以在codeproject上實現這種簡單的發佈者/訂閱者。你會先行一步,因爲大多數的框架有類似的東西:

在MVVM點燃它被稱爲Messenger

在棱有EventAggregator

2)醜陋的解決方案是創建靜態事件在ViewModelA中,這種方式不需要參考

+0

我最終創建了一個分離的靜態類到我的公共活動,其他viewmodels可以訂閱/發佈他們的事件,但我會嘗試mjay第三個鏈接的建議...謝謝 –

1

儘管您可以在ViewModels之間傳遞引用,但它使您的應用緊密耦合,而不是特別可伸縮。同樣,如果您決定在將來進行更改,重構的數量會迅速增長,從而使管理更改變得更加困難。

看看PubSub Event框架。這些都包含在您提到的MVVM框架(如PRISM或MVVM-Light)中,但如果您不需要或不需要上述完整框架,則可以隨時添加自己的版本。

看看here爲簡單的沒有廢話的實現,你應該能夠適應你自己的要求。

+0

哼...在這個過程中,我最終創建了一個分離的靜態類來聲明公共事件,並且每個類都可以發佈訂閱,並且正在工作......現在,從您的建議中看到第三個選項,我非常喜歡它,我會給試試那個......謝謝。 –