[英]How to Communicate between ViewModels?
我正在構建我的第一個WPF和MVVM應用程序。 我有3個視圖(3個對應的ViewModels)
1)MainWindow(窗口)
2)ViewClients(UserControl)
3)ViewModClient(UserControl)
在Clients ViewModel中,我有一個屬性SelectedClient ,它跟蹤視圖中DataGrid上的選定客戶端。 在這個視圖中,我還有一個與MainWindow ViewModel中定義的ICommand相關的按鈕。 我用這個綁定解決它:
Command="{Binding Path=DataContext.CreateViewsCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" CommandParameter={x:Type local:ViewModClient}
我使用CommandParameter告訴mainWindow ViewModel創建哪種視圖並保持viewmodel與視圖知識隔離。 這非常有效。
現在的問題是:
在ModClient ViewModel中,我需要加載客戶端的數據。 那么如何在保持MVVM模式的同時將其與Clients View中的SelectedClient聯系起來呢? (我只能使用一個CommandParameter並且已經使用過了)
通常,這通過使用消息傳遞來完成。
所有MVVM框架都有一個消息傳遞總線,允許進行VM間通信,因此只需獲得一個好的框架,任務就會變得如此簡單( Simple MVVM Toolkit ):
源VM:
SendMessage(MessageTokens.SomeToken, new NotificationEventArgs<string>
(MessageTokens.SomeToken, "MyMessage"));
接收VM:
RegisterToReceiveMessages<string>(MessageTokens.SomeToken, OnMessageReceived);
private void OnMessageReceived(object sender, NotificationEventArgs<string> e)
{
// Code to execute upon message reception.
}
例如,Caliburn.Micro有一個內置的IEventAggregator
,它允許你創建可以訂閱的Eventmanagers。 如果您使用多個ViewModel訂閱此特定EventAggegrator,則可以定義可以從已訂閱此EventAggregator的所有ViewModel發布和接收的消息。
以下只是一個簡短的實現,並顯示,如果您使用像Caliburn.Micro這樣的框架,ViewModel之間的通信會有多簡單:
class ViewModel1 : PropertyChangedBase
{
private IEventAggregator _Event;
public ViewModel1(IEventAggregator events)
{
_Event = events;
_Events.Publish(new TestEvent(5));
}
}
class ViewModel2 : PropertyChangedBase, IHandle<TestEvent>
{
private IEventAggregator _Events;
public ViewModel2(IEventAggregator events)
{
_Events = events;
_Events.Subscribe(this);
}
public void Handle(TestEvent message)
{
// do something with the incoming message
}
}
class TestEvent
{
public int foo { get; set; }
public TestEvent(int someint)
{
foo = someint;
}
}
它應該是非常自我解釋的。 但是,如果您有任何疑問,請告訴我,我會詳細介紹。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.