2011-12-12 21 views
5

Tôi vừa nâng cấp ứng dụng SL4 lên SL5. Tôi đã tải xuống nguồn bộ công cụ ánh sáng MVVM cho SL 5 và xây dựng nó: http://mvvmlight.codeplex.com/SourceControl/changeset/changes/17256019ad97Tin nhắn nhẹ MVVM bị hỏng sau khi cập nhật SL5?

Ban đầu mọi thứ hoạt động tốt, nhưng việc nhắn tin GalaSoft bằng cách nào đó bị hỏng. Tin nhắn được gửi đi, nhưng không bao giờ được nhận bởi người nhận (sử dụng Messenger.Default.Register). Không xây dựng cảnh báo/lỗi và không có lỗi trong cửa sổ đầu ra.

Có ai biết về bất kỳ thay đổi đột phá nào liên quan đến bản cập nhật MVVM Light SL5 mới không?

/Thomas

+3

Bạn có thể vui lòng gửi cho tôi một bản repro tại laurent (at) galasoft (dot) ch, tôi muốn điều tra. Cảm ơn! – LBugnion

+0

Tôi đang sử dụng ánh sáng MVVM mới nhất 3 từ trình cài đặt với Silverlight 5 và tin nhắn vẫn hoạt động, vì vậy nó phải đến từ thiết lập của bạn. – jv42

+0

Chỉ nhìn thấy tôi đã bị phá vỡ là trong 'RaisePropertyChanged()', nhưng đó là tài liệu trên blog của @ LBugnion. – jv42

Trả lời

0

Tôi đã có điều tương tự xảy ra với tôi khi nâng cấp từ một phiên bản cũ của MVVM Light (thay đổi bộ 3bdbffb4e70a “BL0014 Misc”). Gửi ngay lập tức() ngừng hoạt động.

Để giải quyết vấn đề, hãy thử sử dụng bằng cách sử dụng quá tải .Register() với receiveDerivedMessagesToo được đặt thành true.

Sự cố này có thể xảy ra khi gửi() các đối tượng có một số loại DynamicProxy được tạo cho chúng. Ví dụ EntityFramework sẽ thực hiện điều này khi bạn sử dụng thuộc tính Local dưới bất kỳ bộ sưu tập nào trong ngữ cảnh dữ liệu của bạn.

ví dụ: EntityFramework DBContext cho ctx.Dealers.Local sẽ tạo ra một danh sách các mục của loại hình đó trông giống như: System.Data.Entity.DynamicProxies.Dealer_D4CEAA0F527F5360DEB9B2B35305241B76A107C37B9DB8B368984B7DF69AEE1E

Khi phù hợp để Listeners Messenger.SendToTargetOrType đăng ký() sẽ thất bại kể từ khi Loại đăng ký chỉ là "Đại lý" chứ không phải là Proxy của đại lý.

Tại sao điều này được sử dụng để hoạt động mà không yêu cầu receiveDerivedMessagesToo được đặt thành true và không phải bây giờ?

Trước MVVM Light "Messenger.cs" Messenger.SendToTargetOrType() có mã này:

private void SendToTargetOrType<TMessage>(TMessage message, Type messageTargetType, object token) 
{ 
    var messageType = typeof(TMessage); 

này làm việc rất lớn từ các loại thực tế của dữ liệu được truyền không quan trọng, chỉ cần loại của registed kiểu.

Bây giờ mã đã được đổi thành:

private void SendToTargetOrType<TMessage>(TMessage message, Type messageTargetType, object token) 
{ 
    Type messageType = message.GetType(); 

Bây giờ Type của tham số đang được sử dụng để thay thế. Đây là một vấn đề vì nếu "tin nhắn" của bạn là một số loại proxy, việc tìm kiếm người nghe đã đăng ký sẽ không thành công.

Các vấn đề liên quan