簡體   English   中英

如何在ViewModels之間進行通信?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM