2012-02-28 13 views
7

मैं एमवीवीएम प्रकाश ढांचे का उपयोग करने के लिए एक WPF अनुप्रयोग बनाने का उपयोग कर रहा हूं।मैं दृश्य के भीतर से दृश्य कैसे बदलूं?

मुझे क्या करना कोशिश कर रहा हूँ जब उपयोगकर्ता उस दृश्य यह संलग्न ViewModel के लिए एक LoginCommand की शुरूआत के भीतर एक बटन दबाता है, एक दृश्य में एक लॉगिन फार्म का है। वहां से मैं या तो एक नई विंडो लॉन्च करना चाहता हूं जिसमें शेष एप्लिकेशन है, या बस उसी विंडो से दृश्य स्विच करें।

वर्तमान में मैं यह इतना है कि वहाँ एक दृश्य कहा MainView जो अंदर View1 करने के लिए बाध्य एक सामग्री नियंत्रण नहीं है है। हालांकि View2 पर स्विच करने के लिए मुझे इसके लिए मेनव्यू पर बटन डालना होगा, और व्यू 1 के भीतर नहीं, जहां यह संबंधित है।

कोई सलाह?

उत्तर

7

आमतौर पर मैं दो तरीकों में से यह एक कार्य करें:

तो लॉगिन विंडो एक एक बार आवेदन शुरू करने से पहले आवश्यक बात है, मैं 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 संदेश का प्रसारण करता है, ShellViewModelLoginViewModel को बंद करने और ApplicationViewModel से प्रतिस्थापित कर देगा। आप पर Navigation with MVVM

+0

यह एक अच्छा तरीका है इसे प्राप्त करने की तरह लगता है मेरे लेख में इस का एक उदाहरण देख सकते हैं। क्या दृश्य कार्यक्षमता के विपरीत, इस कार्यक्षमता को कोड में पीछे रखने में कोई समस्या नहीं है? – benjgorman

+1

@benjgorman एमवीवीएम डिज़ाइन पैटर्न यूआई कोड और एप्लिकेशन कोड को अलग रखने के लिए है, और मैं 'एप्लिकेशन' क्लास के पीछे कोड को दोनों के बीच एक जादू क्षेत्र के रूप में मानता हूं क्योंकि इसे यूआई और एप्लिकेशन ऑब्जेक्ट्स को प्रारंभ करने की आवश्यकता है आवेदन शुरू करें। ईमानदारी से, मेरे आवेदन में शायद ही कभी 1 से अधिक खिड़की है। मैं वर्तमान सामग्री के प्रबंधन के लिए 'डेटा टेम्पलेट्स' और 'कंटेंटकंट्रोल' का उपयोग करना पसंद करता हूं। आप इसका एक उदाहरण यहां देख सकते हैं [http://rachel53461.wordpress.com/2011/12/18/navigation-with-mvvm-2/) – Rachel

+0

आपके उत्तर में यह हिस्सा सिरदर्द पैदा कर रहा है। 'if (! Login.DialogResult।GetValueOrDefault()) { // त्रुटि कक्षा में त्रुटि का प्रबंधन किया जाता है, यहां नहीं पर्यावरण। एक्सिट (0); } ' मैं इसे आईसीओएमएंड से कैसे बांधूं? मैंने एक आईप्रॉपर्टी चेंजडेवेंट का उपयोग करने की कोशिश की लेकिन लॉगिन बॉक्स प्रकट होने से पहले यह आग लग गई। – benjgorman

2

अपने विचारों को Page तत्वों के अंदर रखें, अपने MainWindow के अंदर फ़्रेम बनाएं और इसे अपने पहले पृष्ठ पर स्रोत दें।

तो पर आप फ्रेम के NavigationService ज्यादा जैसे कि वेब ब्राउज़र, एक और देखने के लिए अपने फ्रेम नेविगेट करने के लिए उपयोग कर सकते हैं से

संबंधित मुद्दे