2017-10-10 12 views
1

自分でMVVMを教えるためのアプリケーションを構築していて、Googling(といくつかの試行錯誤)でViewModelから2番目のウィンドウを開くことができますが、変数を1ページからもう片方。これは私のViewModelです。私は、だから私はこのMVVMLightを使用して変数を2番目のウィンドウに渡しますか?

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(); 
     } 
    } 

を知っている(または私は私が知っていると思う)これは、「ベストプラクティス」ではないかもしれないが、私は戻ってこれに来て、私のようにリファクタリングします私の見解では

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")); 
    } 

MVVM paternとMVVM Lightをよりよく知ることができます。現在、最初のページ(VendorSelectViewModel)のViewModelから2番目のページ(InvoicerWindow)に変数を渡そうとしていますが、正しい構文を管理していません。

変数をあるページから次のページに渡すにはどうすればよいですか?

答えて

2

最初にIMessenger.Send<TMessage>メソッドのパラメータとして任意のオブジェクトを渡すことができます。TMessageタイプのパラメータは制限されません。例えば:あなたはあなたのケースでNotificationMessageクラスに特に便利しかし

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

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

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

あなたは、任意のタイプTの追加プロパティContent公開し、一般的なNotificationMessage<T>バージョンの使用を作ることができた場合:

//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から派生し、追加のメンバーを公開してそれをメッセージオブジェクトとして使用する独自のクラスを作成することができます。

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としたカスタムクラスである:代わりにメッセンジャーにNotificationMessageを渡す

+0

私は自分のクラスを作成するオプションが好きです。これは、ちょうど受信(登録)側で何が起こったのかを明示しているからです。イベントのタイプごとに1つのクラス。 SelectedVendorChangedNotificationMsg、SelectedVendorDeletedNotificationMsg ...などがあります。 – Fredrik

1

、あなたが望むように多くの値を運ぶことができる独自のカスタムタイプのインスタンスを渡すことができますParameter

関連する問題