2012-11-06 40 views
5

Câu hỏi về mẫu MVVM nơi tôi nghĩ rằng tôi đã sai.Truyền đối tượng để xem mô hình

Khi một sự kiện xảy ra trong touchdown một cái nhìn Tôi muốn bật lên một thông điệp tức là .:

private void marker_TouchDown(MessageObject msgData) 
{ 
    CustomMessageControl message = new CustomMessageControl() {Width = 610, Height = 332}; 
    CustomMessageViewModel messageVM = new CustomMessageViewModel(msgData); 
    message.DataContext = messageVM; 
    //Add to canvas 
} 

My viewmodel:

public class CustomMessageViewModel 
{ 
    public MessageObject message { get; set; } 

    public CustomMessageViewModel(MessageObject message) 
    { 
     this.MessageObject = message; 
    } 
} 

này hoạt động nhưng không cảm thấy đúng. Đây có phải là cách chấp nhận được để điền vào mô hình xem không?

+0

Chế độ xem thông thường sẽ sử dụng giao diện INPC (http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx) để hỗ trợ thông báo cho chế độ xem/người tiêu dùng rằng các thuộc tính đã được cập nhật. Tôi rất khuyên bạn nên chống lại việc sửa đổi datacontext trong mã thành một viewmodel mới khi được đính kèm trong kịch bản này. –

+0

Cảm ơn Quinton, tôi hiểu việc sử dụng INPC. Tôi có thể nhìn vào điều này quá nghĩa đen nhưng ở đây ai đó đang nhấp vào một cái nhìn và tôi muốn khởi động một cái nhìn mới đi qua một số dữ liệu liên quan đến điểm họ nhấp vào. –

+1

Xin lỗi, tôi thực sự làm những gì thường được coi là chính xác, nó có thể trông không đẹp trong mã nhưng là cách tiêu chuẩn của instantiating và truyền dữ liệu đến viewmodel, có một số khung MVVM giúp giảm bớt điều này trong thiết kế của họ mà bạn có thể quan tâm nhưng nếu bạn muốn xử lý tất cả theo cách thủ công, đó thường là cách tiếp cận được chấp nhận. –

Trả lời

2

Tôi tin rằng bạn đang vi phạm MVVM khi tạo điều khiển trong mô hình chế độ xem. Đây không phải là thử nghiệm, mô hình xem của bạn để tạo điều khiển ngay bây giờ và điều đó không phải là yêu cầu để kiểm tra (điều này nhấn mạnh việc thiếu sự phân tách mối quan tâm giữa giao diện người dùng và mô hình xem).

Thay vì tạo điều khiển, hoàn toàn có thể chấp nhận được đối với mô hình chế độ xem của bạn để kích hoạt sự kiện của riêng nó. Trong sự kiện này, bạn sẽ chuyển mô hình xem mà bạn muốn hộp thoại/lớp phủ/điều khiển liên kết với, như sau:

public class CustomMessageControlEventArgs : EventArgs 
{ 
    public CustomMessageViewModel CustomMessageViewModel { get; set; } 
} 

public event EventHandler<CustomMessageControlEventArgs> 
    ShowCustomMessageControl; 

private void marker_TouchDown(MessageObject msgData) 
{ 
    // Create the view model. 
    var message = ...; 

    // Get the events. 
    var events = ShowCustomMessageControl; 

    // Fire. 
    if (events != null) events(this, 
     new CustomMessageControlEventArgs { 
      MessageObject = new CustomMessageViewModel(msgData) 
     }); 
} 

Sau đó, trong mã giao diện người dùng, bạn sẽ liên kết với sự kiện và sau đó hiển thị giao diện người dùng thích hợp cho sự kiện đó.

Hãy nhớ rằng, MVVM không nghiêm chỉnh về việc có thể khai báo mọi thứ trong XAML hoặc liên kết dữ liệu với giao diện người dùng thông qua chỉ ràng buộc dữ liệu, đó là tách mã đúng cách.

Bạn muốn tách riêng những gì về nội dung được hiển thị (kiểu xem) từ cách hiển thị của nội dung được hiển thị (giao diện người dùng); trong việc kích hoạt một sự kiện, bạn đang duy trì sự phân tách mối quan tâm đó. Có, bạn sẽ phải viết một số mã phía sau (hoặc bạn có thể làm điều đó thông qua thay đổi thông báo thuộc tính, nhưng nó xấu hơn, thẳng thắn), nhưng nó duy trì sự tách biệt và cho phép dễ dàng kiểm tra mà không phải mang đến bất kỳ người dùng nào các yếu tố giao diện.

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