2013-08-06 25 views
6

Có thể ai đó có thể giải thích MVVM Light Messenger cho tôi không? Tôi đã đọc một bài viết trên StackOverflow ở đây: MVVM pass values between view models cố gắng để có được điều này. Các tài liệu về MVVM Light không phải là tuyệt vời vào thời điểm này vì vậy tôi hoàn toàn không chắc chắn nơi để đi.Sử dụng Messenger của MVVM Light để chuyển các giá trị giữa Xem mô hình

Giả sử tôi có hai Chế độ xem và một ViewModelLocator. Tôi muốn có thể chuyển các thông số giữa cả ba mà không có vấn đề. Làm thế nào tôi sẽ làm điều này với sứ giả? Nó có khả năng đó không?

Chỉnh sửa: Đây là triển khai mới của tôi. Hiện tại, có vẻ như MessengerInstance không gọi mã thông báo. Tôi vô cùng bối rối.

Trong ViewModel đầu tiên:

MessengerInstance.Send<XDocument>(SelectedDocument); 

Và trong lần thứ hai:

MessengerInstance.Register<XDocument>(this, xdoc => CopySettings(xdoc)); 

Có thể là hoàn toàn sai. Đã không có cơ hội để thử nghiệm nó, nhưng studio trực quan ít tức giận với tôi khi tôi làm theo cách này. Ngoài ra MessengerInstance không đăng ký trước khi tin nhắn được gửi đi.

+0

"nhưng visual studio được ít giận tôi khi tôi làm theo cách này ". Ha. Điều đó làm tôi cười khúc khích. :) –

Trả lời

12

Giả sử tôi có hai Chế độ xem và Chế độ xemModelLocator. Tôi muốn có thể chuyển các thông số giữa cả ba mà không có vấn đề. Làm thế nào tôi sẽ làm điều này với sứ giả? Nó có khả năng đó không?

Đó chính xác là những gì nó có, vâng.

Để gửi một tin nhắn:

MessengerInstance.Send(payload, token); 

Tiếp nhận một thông điệp:

MessengerInstance.Register<PayloadType>(
    this, token, payload => SomeAction(payload)); 

Có rất nhiều quá tải, vì vậy mà không biết chính xác những gì bạn đang cố gắng để thực hiện thông qua messenger, tôi đã thắng 't đi vào tất cả chúng, nhưng ở trên nên bao gồm các trường hợp đơn giản của muốn gửi và nhận một tin nhắn với một trọng tải.

Lưu ý rằng "mã thông báo" có thể thực sự là bất kỳ thứ gì xác định thư. Trong khi một chuỗi thường được sử dụng cho điều này, tôi thích sử dụng một enum vì nó an toàn hơn một chút và cho phép IntelliSense "tìm cách dùng", vv

Ví dụ:

public enum MessengerToken 
{ 
    BrushChanged, 
    WidthChanged, 
    HeightChanged 
} 

Sau đó, bạn gửi/nhận sẽ là một cái gì đó như:

// sending view model 
MessengerInstance.Send(Brushes.Red, MessengerToken.BrushChanged); 

// receiving view model 

// put this line in the constructor 
MessengerInstance.Register<Brush>(this, token, brush => ChangeColor(brush)); 

public void ChangeColor(Brush brush) 
{ 
    Brush = brush; 
} 

[EDIT] URL để bình luận devuxer của dưới đây để thay đổi: http://blog.galasoft.ch/posts/2009/09/mvvm-light-toolkit-messenger-v2/

+0

Điều này thật hoàn hảo! Tôi đã cố gắng tìm kiếm tài liệu về điều này nhưng không tìm thấy. Bạn có biết bất kỳ tài liệu nào tôi có thể bị thiếu không? Tôi đã thấy hầu như không có gì cho MVVM Light. – DanteTheEgregore

+0

Người đã phát triển MVVM Light, Laurent Bugnion, có xu hướng sử dụng blog của mình để giới thiệu các tính năng mới hoặc cập nhật các tính năng. Dưới đây là một mục cụ thể trên sứ giả bạn có thể thấy hữu ích: http://blog.galasoft.ch/lbugnion/archive/2009/09/27/mvvm-light-toolkit-messenger-v2-beta.aspx – devuxer

+0

Tôi đã đi phẫu thuật và không có cơ hội để bắt đầu thực hiện điều này cho đến ngày hôm nay. Tôi không thấy nơi MessengerInstance gọi mã thông báo. Tôi sẽ thêm triển khai của mình vào bài đăng chính. Tôi cũng đã đăng một câu hỏi khác tại đây: http://stackoverflow.com/questions/18241290/mvvm-light-messenger-not-functioning-as-expected/18241995?noredirect=1#18241995 – DanteTheEgregore