2010-02-10 18 views
6

मेरे WPF परियोजना इस तरह का आयोजन किया जाएगा बिना स्क्रीन दसगुणा: Screens.Group1.Screen1 में ScreenManager.Show("Group1.Screen1") यह दिखता है (प्रतिबिंब का उपयोग कर):जादू तार

Screens 
    Group1 
     Screen1 
     View.xaml 
     ViewModel.cs 
    Group2 
     Screen2 
     View.xaml 
     ViewModel.cs 

Screen2 मैं कुछ इस तरह से इस्तेमाल करेंगे Screen1 दिखाने के लिए एक दृश्य और एक ViewModel के लिए नामस्थान और उन्हें तत्काल।

मैं Screen1 और Screen2 युग्मन (मैं नहीं चाहता कि Screen1 नाम स्थान का उपयोग करने के Screen2 में कक्षाएं चाहते हैं) के बिना जादू स्ट्रिंग कैसे समाप्त कर सकते हैं। इसके अलावा मुझे कुछ प्रकार की स्क्रीन डिस्कवरी (स्वत: पूर्णता/इंटेलिजेंस)

या शायद कुछ तरीका (स्वचालित परीक्षण) सत्यापित करने के लिए कि ScreenManager.Show पर सभी कॉल मान्य हैं।

अद्यतन: मैं इस के साथ आया था:

public class ScreenNames 
{ 
    public Group1Screens Group1; 

    public class Group1Screens 
    { 
     public ScreenName Screen1; 
    } 
} 

public sealed class ScreenName 
{ 
    private ScreenName() { } 
} 

public class ScreenManager : IScreenManager 
{ 
    public void Show(Expression<Func<ScreenNames, ScreenName>> x) {} 
} 

उपयोग:

screenManager.Show(x=>x.Group1.Screen1); 

आदर्श नहीं है, लेकिन मैं का उल्लंघन मान लें कि सूखी अभी भी जादू तार से बेहतर है। और मैं स्वचालित रूप से (प्रतिबिंब के साथ) परीक्षण कर सकता हूं कि सभी कॉल मान्य हैं।

+0

स्क्रीन 2 को स्क्रीन 1 के बारे में जानने की आवश्यकता क्यों है? स्क्रीन स्क्रीन प्रत्येक स्क्रीन के बाहर मौजूद नहीं है? और इंटेलिसेंस द्वारा, आप कह रहे हैं कि विकास के दौरान आप स्क्रीनमैनेजर टाइप करना शुरू करते समय ड्रॉपलिस्ट में प्रत्येक स्क्रीन के नाम दिखाना चाहते हैं। दिखाएं()? स्क्रीन स्थिर या गतिशील (रनटाइम पर लोड) की सूची है? – Dave

+0

आखिरकार मैं एक पैरामीटर पाउंगा; ScreenManager ViewModel की एक संपत्ति होगी; इंटेलिजेंस के लिए मुझे लगता है कि एक स्थैतिक सूची जरूरी है:/ मुझे लगता है कि मेरे पास ऐसा कुछ हो सकता है: ScreenManager.Show (x => x.Group1।स्क्रीन 1) –

+0

स्क्रीनमैनेजर जैसे उपयोग। शो (x => x.Group1.Screen1) का मतलब होगा कि मुझे स्क्रीन की एक अलग सूची रखना और बनाए रखना होगा, लेकिन मुझे लगता है कि अगर कोई इंटेलिजेंस –

उत्तर

3

आप, WPF में सभी कि ScreenManager सामान की जरूरत नहीं है क्योंकि DataTemplate इंजन शुद्ध मार्कअप के साथ आप के लिए इस की देखभाल कर सकते हैं।

आप सामग्री प्रदाता और डेटा टेम्पलेट्स के समूह के साथ अपने एप्लिकेशन के किसी विशेष क्षेत्र को आसानी से डेटाबेस कर सकते हैं। इस क्षेत्र को 'रूट' व्यू मॉडेल की संपत्ति से बांधें, और 'रूट' व्यूमोडेल को लागू करें IotifyProperty को लागू करें ताकि WPF जानता है कि क्या आप उस क्षेत्र में ViewModel को बदलते हैं।

public class RootViewModel : INotifyPropertyChanged 
{ 
    public object Screen1ViewModel { get; } 

    public object Screen2ViewModel { get; } 
} 

DataBind एक ContentPresenter Screen1ViewModel संपत्ति

<ContentControl Content="{Binding Path=Screen1ViewModel}" /> 

और इसी तरह अगले एक के लिए उपयोग करने के लिए नियंत्रण। जब आपको स्क्रीन 1 की सामग्री को बदलने की आवश्यकता होती है, तो आप बस कोड से Screen1ViewModel को फिर से असाइन करते हैं, और उठाए गए प्रॉपर्टी चेंज किए गए ईवेंट की वजह से, WPF इसे उठाएगा और नए व्यूमोडेल को एक नए व्यू में बाध्य करेगा।

DataTemplates इस के रूप में सरल हो सकता है:

<Window.Resources> 
    <DataTemplate DataType="{x:Type foo:MyViewModel}"> 
     <self:MyControl /> 
    </DataTemplate> 
    <DataTemplate DataType="{x:Type foo:MyOtherViewModel}"> 
     <self:MyOtherControl /> 
    </DataTemplate> 
</Window.Resources> 

मामले में आप इसे से परिचित नहीं हैं, this article on MVVM in WPF एक उत्कृष्ट परिचय है।

+0

आपके उत्तर के लिए धन्यवाद, मुझे यकीन नहीं है कि मैं पूरी तरह से समझ में आया लेकिन यह मेरे प्रश्न का उत्तर नहीं देता है: व्यूमोडेल के decoupled को कैसे रखा जाए? मैं स्क्रीन 2 –

+0

@ मार्क का सीधे उपयोग करने के लिए स्क्रीन 2 व्यूमोडल नहीं चाहता हूं: मुझे यह दृष्टिकोण बहुत पसंद है, लेकिन मुझे यकीन नहीं है कि कैटलिन के बाद यह क्या है। यह लगभग मुझे लगता है जैसे वह प्रकार के नेविगेशन को कार्यान्वित करना चाहता है और एक पृष्ठ से दूसरे पृष्ठ पर जाने में सक्षम होना चाहता है। अगर मैं आपके दृष्टिकोण को समझता हूं, तो आप व्यूमोडेल को डाटाबेसिंग के माध्यम से स्विच करने का सुझाव देते हैं, जो वास्तव में अच्छा है, लेकिन मुझे नहीं पता कि वह उसके बाद क्या है। बीटीडब्लू, क्या आप किसी भी अच्छे ऑनलाइन पढ़ने की सिफारिश कर सकते हैं जो उदाहरणों के माध्यम से जाता है जहां आप व्यूमोडल्स को बदलना चाहते हैं? मेरे पास हमेशा 1: 1: 1 रिश्ते है व्यू: व्यू मॉडेल: मॉडल और व्यूमोडेल को कभी भी बदलें (क्योंकि मुझे इसके फायदे नहीं हैं)। – Dave

+0

@ कैटलिन डीआईसीयू: इस मॉडल में, Screen1ViewModel को Screen2ViewModel और इसके विपरीत कुछ भी नहीं पता है। रूटव्यूमोडेल स्पष्ट रूप से दोनों के बारे में जानते हैं, लेकिन ध्यान दें कि दोनों गुणों को सिस्टम सिस्टम के रूप में घोषित किया जाता है। ऑब्जेक्ट, यह दर्शाता है कि वे वास्तव में कुछ भी हो सकते हैं। यदि आप रूटवीव मॉडेल में वीएम प्रकारों के बारे में ज्ञान को कड़ी मेहनत नहीं करना चाहते हैं, तो आप VVs को RootViewModel में इंजेक्ट करने के लिए DI का उपयोग कर सकते हैं। यह इसे 'रूटव्यूमोडेल (ऑब्जेक्ट vm1, ऑब्जेक्ट vm2)' जैसे कन्स्ट्रक्टर देगा। –

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