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
Đ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
@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
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