2017-10-10 65 views
1

我正在構建一個應用程序來教自己MVVM和一些Google搜索(以及一些試用錯誤)我已經設法達到了可以從ViewModel打開第二個窗口的程度,但不能將變量從一個頁面傳遞到另一個。這是我的ViewModel。使用MVVMLight將變量傳遞給第二個窗口?

public VendorSelectViewModel() 
    { 
     Ping ping = new Ping(); 
     PingReply pingresult = ping.Send("192.168.1.10"); 
     if (pingresult.Status.ToString() == "Success") 
     { 
      LoadVendorsAsync(); 
     } 
     else 
     { 
      LoadVendors(); 
     } 

     NextCommand = new RelayCommand(NextWindow); 
    } 

    public ICommand NextCommand { get; private set; } 

    void NextWindow() 
    { 
     Console.WriteLine(selectedVendor.VendorName); 
     Messenger.Default.Send(new NotificationMessage("NextWindow")); 
    } 

在我看來,我有這個

public VendorSelectWindow() 
    { 
     InitializeComponent(); 
     _vm = new Biz.Invoicer.VendorSelectViewModel(); 
     DataContext = _vm; 

     Messenger.Default.Register<NotificationMessage>(this, NotificationMessageReceived); 
    } 

    private void NotificationMessageReceived(NotificationMessage msg) 
    { 
     if (msg.Notification == "NextWindow") 
     { 
      var invoicerWindow = new InvoicerWindow(); 
      invoicerWindow.Show(); 
     } 
    } 

所以我知道(或我想我知道)這可能不是一個「最佳實踐」,但我會回來這一點,並重構爲我更好地瞭解MVVM模板和MVVM Light。目前我正在嘗試將第一頁(VendorSelectViewModel)的ViewModel變量傳遞給第二頁(InvoicerWindow),但是我沒有設法修改語法。

我需要做什麼才能將變量從一頁傳遞到下一頁?

回答

2

首先,您可以傳遞任意對象作爲IMessenger.Send<TMessage>方法的參數 - TMessage類型參數不受限制。例如:

//ViewModel: 
void NextWindow() 
{ 
    //... 
    int someValue = 10; 
    Messenger.Default.Send(someValue); 
} 

//View: 
public VendorSelectWindow() 
{ 
    //... 
    Messenger.Default.Register<int>(this, MessageReceived); 
} 

private void MessageReceived(int value) 
{ 
    //... 
} 

然而,如果你發現NotificationMessage類,你的情況是特別有用的,你可以利用通用NotificationMessage<T>版本,它公開任意類型T的附加屬性Content

//ViewModel: 
void NextWindow() 
{ 
    //... 
    int someValue = 10; 
    Messenger.Default.Send(new NotificationMessage<int>(someValue, "Notification text")); 
} 

//View: 
public VendorSelectWindow() 
{ 
    //... 
    Messenger.Default.Register<NotificationMessage<int>>(this, MessageReceived); 
} 

private void MessageReceived(NotificationMessage<int> message) 
{ 
    var someValue = message.Content; 
    //... 
} 

或者,如果這不適合你,你可以創建自己的類,從NotificationMessage派生出來並公開其他成員並將其用作消息對象。

+0

我更喜歡創建我自己的類的選項,因爲它明確發生在接收(註冊)方面。每種類型的事件一個類。 SelectedVendorChangedNotificationMsg,SelectedVendorDeletedNotificationMsg ...等等。 – Fredrik

1

不是傳遞一個NotificationMessage的使者,你可以通過自己的自定義類型的實例,它可以攜帶儘可能多的價值,你想:

void NextWindow() 
{ 
    Console.WriteLine(selectedVendor.VendorName); 
    Messenger.Default.Send(new YourPayload() {WindowName = "NextWindow", Parameter = "some value..:"); 
} 
... 

public VendorSelectWindow() 
{ 
    InitializeComponent(); 
    _vm = new Biz.Invoicer.VendorSelectViewModel(); 
    DataContext = _vm; 

    Messenger.Default.Register<YourPayload>(this, NotificationMessageReceived); 
} 

private void NotificationMessageReceived(YourPayload msg) 
{ 
    if (msg.WindowName == "NextWindow") 
    { 
     string param = msg.Parameter; 
     var invoicerWindow = new InvoicerWindow(); 
     invoicerWindow.Show(); 
    } 
} 

YourPayload是具有兩個屬性,WindowName和自定義類Parameter

相關問題