2012-02-28 82 views
7

Tôi đang tạo một ứng dụng WPF sử dụng khung công tác ánh sáng MVVM.Làm cách nào để chuyển đổi chế độ xem từ trong chế độ xem?

Điều tôi đang cố gắng làm là có biểu mẫu đăng nhập trong chế độ xem, khi người dùng nhấn một nút trong chế độ xem đó, nó sẽ khởi chạy LoginCommand cho ViewModel được đính kèm. Từ đó tôi muốn khởi chạy một cửa sổ mới chứa phần còn lại của ứng dụng, hoặc đơn giản là chuyển đổi các khung nhìn từ cùng một cửa sổ.

Hiện tại tôi có nó để có chế độ xem được gọi là MainView có kiểm soát nội dung bên trong ràng buộc với View1. Tuy nhiên để chuyển sang View2 tôi cần phải đặt nút cho điều này trên MainView, và không phải trong View1 nơi nó thuộc về.

Bất cứ lời khuyên?

Trả lời

7

Thường thì tôi làm điều này một trong hai cách sau:

Nếu cửa sổ đăng nhập là một điều một thời gian cần thiết trước khi bắt đầu ứng dụng, tôi sẽ đặt nó trong phương pháp OnStartup() của đối tượng Application

protected override void OnStartup(StartupEventArgs e) 
{ 
    base.OnStartup(e); 

    // Login 
    var login = new LoginDialog(); 
    var loginVm = new LoginViewModel(); 

    login.DataContext = loginVm; 
    login.ShowDialog(); 

    if (!login.DialogResult.GetValueOrDefault()) 
    { 
     // Error is handled in login class, not here 
     Environment.Exit(0); 
    } 

    // If login is successful, show main application 
    var app = new ShellView(); 
    var appModel = new ShellViewModel(); 

    app.DataContext = viewModel; 
    app.Show(); 
} 

Cách khác tôi thường làm là thông qua ShellViewModel hoặc ApplicationViewModel xử lý tất cả quản lý cửa sổ của tôi. Phương pháp này sử dụng DataTemplates để xác định từng màn hình và sử dụng ContentControl làm trình giữ chỗ cho màn hình hiện tại trong ShellView hoặc ApplicationView.

Tôi thường kết hợp điều này với một Hệ thống sự kiện thuộc loại nào đó, chẳng hạn như Microsoft Prism's EventAggregator, vì vậy nó có thể nghe tin nhắn của một loại cụ thể, chẳng hạn như OpenWindow hoặc CloseWindow tin nhắn. Nếu bạn quan tâm, tôi có một bài đăng trên blog về số Communication between ViewModels nên cung cấp cho bạn ý tưởng tốt hơn về hệ thống sự kiện trông như thế nào.

Ví dụ, ShellViewModel tôi có thể bắt đầu bằng cách hiển thị một LoginViewModel (một DataTemplate được sử dụng để nói với WPF để vẽ LoginViewModel với LoginView), và nó sẽ đăng ký để nhận tin nhắn kiểu SuccessfulLogin. Sau khi phát sóng LoginViewModel thông báo SuccessfulLogin, ShellViewModel sẽ đóng số LoginViewModel và thay thế bằng ApplicationViewModel. Bạn có thể xem ví dụ về điều này trong bài viết của tôi trên Navigation with MVVM

+0

Điều này có vẻ như là một cách hay để đạt được điều đó. Không có vấn đề gì khi đặt chức năng này vào mã phía sau, trái ngược với mô hình xem? – benjgorman

+1

@benjgorman Mẫu thiết kế MVVM có nghĩa là giữ mã UI và mã ứng dụng riêng biệt, và tôi xem xét mã đằng sau lớp 'Application' như một vùng ma thuật giữa hai vì nó cần khởi tạo cả UI và các đối tượng ứng dụng bắt đầu ứng dụng. Thành thật mà nói, tôi hiếm khi có nhiều hơn 1 cửa sổ trong ứng dụng của tôi. Tôi thích sử dụng 'DataTemplates' và' ContentControls' để quản lý nội dung hiện tại. Bạn có thể xem một ví dụ về điều này [ở đây] (http://rachel53461.wordpress.com/2011/12/18/navigation-with-mvvm-2/) – Rachel

+0

Trong câu trả lời của bạn, phần này khiến anh ấy đau đầu. 'if (! Login.DialogResult.GetValueOrDefault()) { // Lỗi được xử lý trong lớp đăng nhập, không phải ở đây Environment.Exit (0); } ' Làm cách nào để liên kết điều này với ICommand? Tôi đã thử sử dụng một IPropertyChangedEvent nhưng nó cháy trước khi hộp đăng nhập xuất hiện. – benjgorman

2

Đặt chế độ xem của bạn bên trong các yếu tố Page, bên trong MainWindow tạo Khung và trỏ nguồn đó đến trang đầu tiên của bạn.

Từ đó bạn có thể sử dụng khung của NavigationService để điều hướng khung của bạn sang chế độ xem khác, giống như trình duyệt web.

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