आमतौर पर मैं दो तरीकों में से यह एक कार्य करें:
तो लॉगिन विंडो एक एक बार आवेदन शुरू करने से पहले आवश्यक बात है, मैं Application
वस्तु की OnStartup()
विधि में यह डाल देंगे
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();
}
दूसरी तरफ मैं आमतौर पर ऐसा करता हूं ShellViewModel
या ApplicationViewModel
जो मेरे सभी विंडो प्रबंधन को संभालता है। इस विधि का उपयोग करता है DataTemplates
प्रत्येक स्क्रीन परिभाषित करने के लिए, और ShellView
या ApplicationView
में वर्तमान स्क्रीन के लिए एक प्लेसहोल्डर के रूप में एक ContentControl
उपयोग करता है।
मैं आमतौर पर किसी तरह का कोई इवेंट सिस्टम, माइक्रोसॉफ्ट प्रिज्म के EventAggregator
तरह के साथ इस गठबंधन, तो यह इस तरह के OpenWindow
या CloseWindow
संदेश के रूप में एक विशेष प्रकार का संदेश, के लिए सुन सकते हैं। यदि आप रुचि रखते हैं, तो मेरे पास Communication between ViewModels पर एक ब्लॉग पोस्ट है जो आपको एक बेहतर घटना प्रदान करेगी कि एक ईवेंट सिस्टम कैसा दिखता है।
उदाहरण के लिए, मेरी ShellViewModel
एक LoginViewModel
प्रदर्शित करके शुरू कर सकते हैं (एक DataTemplate
WPF बताने के लिए LoginView
साथ LoginViewModel
आकर्षित करने के लिए प्रयोग किया जाता है), और यह प्रकार SuccessfulLogin
का संदेश प्राप्त करने के लिए सदस्यता होगा। एक बार जब LoginViewModel
एक SuccessfulLogin
संदेश का प्रसारण करता है, ShellViewModel
LoginViewModel
को बंद करने और ApplicationViewModel
से प्रतिस्थापित कर देगा। आप पर Navigation with MVVM
यह एक अच्छा तरीका है इसे प्राप्त करने की तरह लगता है मेरे लेख में इस का एक उदाहरण देख सकते हैं। क्या दृश्य कार्यक्षमता के विपरीत, इस कार्यक्षमता को कोड में पीछे रखने में कोई समस्या नहीं है? – benjgorman
@benjgorman एमवीवीएम डिज़ाइन पैटर्न यूआई कोड और एप्लिकेशन कोड को अलग रखने के लिए है, और मैं 'एप्लिकेशन' क्लास के पीछे कोड को दोनों के बीच एक जादू क्षेत्र के रूप में मानता हूं क्योंकि इसे यूआई और एप्लिकेशन ऑब्जेक्ट्स को प्रारंभ करने की आवश्यकता है आवेदन शुरू करें। ईमानदारी से, मेरे आवेदन में शायद ही कभी 1 से अधिक खिड़की है। मैं वर्तमान सामग्री के प्रबंधन के लिए 'डेटा टेम्पलेट्स' और 'कंटेंटकंट्रोल' का उपयोग करना पसंद करता हूं। आप इसका एक उदाहरण यहां देख सकते हैं [http://rachel53461.wordpress.com/2011/12/18/navigation-with-mvvm-2/) – Rachel
आपके उत्तर में यह हिस्सा सिरदर्द पैदा कर रहा है। 'if (! Login.DialogResult।GetValueOrDefault()) { // त्रुटि कक्षा में त्रुटि का प्रबंधन किया जाता है, यहां नहीं पर्यावरण। एक्सिट (0); } ' मैं इसे आईसीओएमएंड से कैसे बांधूं? मैंने एक आईप्रॉपर्टी चेंजडेवेंट का उपयोग करने की कोशिश की लेकिन लॉगिन बॉक्स प्रकट होने से पहले यह आग लग गई। – benjgorman