Có hai cách tốt để làm điều này, 1) dịch vụ hộp thoại (dễ dàng, sạch sẽ) và 2) được hỗ trợ. Xem hỗ trợ cung cấp một số tính năng gọn gàng, nhưng thường không đáng.
DỊCH VỤ DIALOG
a) giao diện dịch vụ hộp thoại như thông qua hàm tạo hoặc một số thùng chứa phụ thuộc:
interface IDialogService
{
Task ShowDialogAsync(DialogViewModel dlgVm);
}
b) Việc triển khai IDialogService của bạn sẽ mở một cửa sổ (hoặc đưa một số điều khiển vào cửa sổ đang hoạt động), tạo chế độ xem tương ứng với tên của loại dlgVm đã cho (sử dụng đăng ký hoặc quy ước vùng chứa hoặc ContentPresenter với loại DataTemsheet được liên kết). ShowDialogAsync sẽ tạo một TaskCompletionSource và trả về phần mềm .Task của nó. Bản thân lớp DialogViewModel cần một sự kiện mà bạn có thể gọi trong lớp dẫn xuất khi bạn muốn đóng và xem trong chế độ xem hộp thoại để thực sự đóng / ẩn hộp thoại và hoàn thành TaskCompletionSource.
b) Để sử dụng, chỉ cần gọi await this.DialogService.ShowDialog (myDlgVm) trong trường hợp của bạn về một số lớp có nguồn gốc DialogViewModel. Sau khi chờ trả về, hãy xem các thuộc tính bạn đã thêm trên VM hộp thoại của mình để xác định điều gì đã xảy ra; bạn thậm chí không cần gọi lại.
XEM HIST TRỢ
Điều này có quan điểm của bạn nghe một sự kiện trên viewmodel. Tất cả điều này có thể được gói gọn trong một Hành vi hòa trộn để tránh mã phía sau và việc sử dụng tài nguyên nếu bạn quá thiên về (FMI, phân lớp lớp "Hành vi" để xem một loại thuộc tính có thể trộn được trên steroid). Hiện tại, chúng tôi sẽ thực hiện việc này theo cách thủ công trên mỗi chế độ xem:
a) Tạo OpenXXXXXDialogEvent với tải trọng tùy chỉnh (lớp dẫn xuất DialogViewModel).
b) Có chế độ xem đăng ký sự kiện trong sự kiện OnDataContextChanged của nó. Đảm bảo ẩn và hủy đăng ký nếu giá trị cũ! = Null và trong sự kiện Unloaded của Window.
c) Khi sự kiện kích hoạt, hãy mở chế độ xem của bạn, có thể là tài nguyên trên trang của bạn hoặc bạn có thể định vị nó theo quy ước ở nơi khác (như trong cách tiếp cận dịch vụ hộp thoại).
Cách tiếp cận này linh hoạt hơn, nhưng đòi hỏi nhiều công việc hơn để sử dụng. Tôi không sử dụng nó nhiều. Ví dụ, một lợi thế tốt là khả năng đặt chế độ xem bên trong một tab. Tôi đã sử dụng một thuật toán để đặt nó trong giới hạn của điều khiển người dùng hiện tại hoặc nếu không đủ lớn, đi qua cây thị giác cho đến khi tìm thấy một thùng chứa đủ lớn.
Điều này cho phép các hộp thoại gần với nơi chúng thực sự được sử dụng, chỉ làm mờ phần ứng dụng liên quan đến hoạt động hiện tại và cho phép người dùng di chuyển xung quanh trong ứng dụng mà không cần phải đẩy các hộp thoại theo cách thủ công, thậm chí có nhiều giao diện. hộp thoại phương thức mở trên các tab hoặc chế độ xem phụ khác nhau.