2011-08-13 21 views
5

Tôi đang làm việc trên một ứng dụng MVVM lớn. Tôi đang sử dụng bộ công cụ ánh sáng MVVM cho việc này. Ứng dụng này giống như một trình duyệt web với các nút quay lại và tiến lên. Chế độ xem chính là điều khiển người dùng. Tôi đặt các nút quay lại và tiến lên trong điều khiển người dùng chính. Chế độ xem chính lần lượt có các điều khiển người dùng. Điều khiển người dùng thay đổi khi các nút quay lại và tiến lên được nhấp. ViewModel chính theo dõi điều khiển người dùng hiện tại và tải phần tiếp theo tùy thuộc vào nút bấm.MVVM: Truyền thông

Tất cả các điều khiển người dùng này được tải tùy thuộc vào lựa chọn (ID) được thực hiện trong bước đầu tiên. Giả sử, chế độ xem chính là màn hình tìm kiếm và chúng tôi chọn khách hàng. Màn hình tiếp theo sẽ là Địa chỉ, Thanh toán, Yêu cầu, v.v. Các màn hình này không chia sẻ bất kỳ dữ liệu nào. Nhưng dữ liệu dành cho cùng một khách hàng.

Vì vậy, thực tiễn tốt là lưu trữ ID khách hàng trong chế độ xem chính? Nếu tôi làm điều này, tôi nên có một sự kiện UserControl_Loaded ràng buộc với một lệnh, nơi mà tôi sau đó sẽ yêu cầu Địa chỉ và thông tin thanh toán.

Hoặc tôi có thể di chuyển các nút (nút quay lại và tiến lên) đến từng điều khiển người dùng thay vì chế độ xem chính, Chuyển ID khách hàng bằng thông báo sẽ tải chế độ xem tiếp theo.

Điều nào tốt hơn?

+0

Để phân tách mọi thứ, hãy cân nhắc sử dụng MVVM Light 'Messenger' để xuất bản các tin nhắn' CustomerSelected' (có thể chứa Id), thay vì sử dụng lệnh. Các điều khiển khác của bạn sau đó có thể đăng ký tin nhắn này. –

+0

Suy nghĩ trực tiếp của tôi về điều này là, nếu các nút quay lại và chuyển tiếp nằm trong giao diện Chính, tùy thuộc vào nguồn (Chế độ xem hiện tại), tôi cần gửi tin nhắn đến các kiểu xem. Tôi muốn tránh điều đó (gửi một tin nhắn từ chế độ xem chính tùy thuộc vào chế độ xem hiện tại). Vì vậy, tôi đã nghĩ đến sự kiện User_Control Loaded. – katie77

+0

Tại sao bạn muốn tránh gửi tin nhắn? –

Trả lời

4

Cách tôi đã thực hiện loại điều này trong quá khứ là triển khai lớp đóng gói ngữ cảnh dữ liệu cho thao tác. Tất cả các trang sẽ được điền với các thuộc tính (và cập nhật) của lớp này. Mô hình khung nhìn chính tạo ra một thể hiện của lớp này và một tập hợp các mô hình khung nhìn trang, cung cấp mỗi mô hình với bối cảnh dữ liệu. Nó cũng xử lý điều hướng từ trang này sang trang khác, triển khai các thuộc tính CurrentPage, NavigateForwardCommandNavigateBackwardCommand.

Nếu người dùng sao lưu vào trang 1 và thay đổi ID khách hàng, ngữ cảnh dữ liệu được bổ sung lại thông tin phù hợp với khách hàng mới. Vì tất cả các trang đang xem xét cùng một đối tượng bối cảnh dữ liệu, tất cả các trang tiếp theo sẽ hiển thị thông tin phù hợp.

Bạn cần triển khai thông báo thay đổi thuộc tính trong đối tượng ngữ cảnh dữ liệu và xử lý PropertyChanged trong các trang. Khi thay đổi thuộc tính CustomerID thuộc tính trong đối tượng ngữ cảnh dữ liệu, các mô hình xem trang sẽ cần phải làm mới các thuộc tính xuất hiện trong chế độ xem tương ứng của chúng.

+0

Câu trả lời hay. Chỉ cần thêm một vài bit .... Mỗi khung nhìn, cũng như khung nhìn chính nên có một đại diện ngữ cảnh dữ liệu của loại hoạt động mà nó đang thực hiện. Nếu lựa chọn của khách hàng đang diễn ra ở chế độ xem chính, ngữ cảnh dữ liệu của nó sẽ có thuộc tính SelectedCustomerId.Nhưng cuối cùng, quan điểm chính sẽ phải thông báo cho trẻ em xem những thay đổi này bằng cách nào đó và một cách là cung cấp cho mỗi trẻ xem tham chiếu đến bối cảnh dữ liệu của chế độ xem chính mà từ đó chúng có thể xác định ID khách hàng hiện tại. –

+0

Xin chào, tôi bối rối ở đây. Xin lỗi, nếu tôi hỏi những câu hỏi cơ bản. Nhưng trong ánh sáng MVVM có một Model định vị View. Chúng ta tạo một thể hiện của mô hình khung nhìn trong lớp đó. Tôi đã cố gắng tạo một lớp có tất cả các kiểu xem và đã cố gắng tạo mô hình khung nhìn. Nhưng nó không hoạt động – katie77

+0

Tôi nghĩ rằng bạn sẽ cần phải điều tra những gì thực sự xảy ra khi bạn cố gắng để nhanh chóng đối tượng này, và mô tả những gì, cụ thể, không hoạt động như bạn mong đợi. –