2011-12-18 18 views
8

मैं एक ऐसे एप्लिकेशन का निर्माण कर रहा हूं जो काफी कमांड का उपयोग करता है, और वे मेरे व्यूमोडल को अपनाना चाहते हैं। एमवीवीएम मेरे लिए नया है, इसलिए खेद है कि यह सवाल थोड़ा बेवकूफ है। क्या अव्यवस्था को कम करने का कोई तरीका है? उदाहरण के लिए यदि आप यहां अव्यवस्था का एक हिस्सा देख सकते हैं ..मैं व्यूमोडेल में कमांड क्लटर से कैसे बच सकता हूं?

private void InitializeCommands() 
    { 
     LogoutCommand = new RelayCommand(Logout); 
     OpenCommand = new RelayCommand(SetImage); 
     SaveCommand = new RelayCommand(SaveImage, SaveImageCanExecute); 
     UploadToFlickrCommand = new RelayCommand(UploadToFlickr); 
     CropCommand = new RelayCommand(SetCropMouseEvents); 
     RemoveRedEyeCommand = new RelayCommand(SetRemoveRedEyeMouseEvents); 
     TextInputCropCommand = new RelayCommand(CropFromText); 
     ReloadImageCommand = new RelayCommand(ReloadImage); 
     FlipYCommand = new RelayCommand(FlipY); 
     Rotate90RCommand = new RelayCommand(Rotate90R); 
     FlipXCommand = new RelayCommand(FlipX); 
     ToGrayscaleCommand = new RelayCommand(ToGrayscale); 
     ToSepiaCommand = new RelayCommand(ToSepia); 
     WindowClosingCommand = new RelayCommand(WindowClosing); 
     EffectsViewCommand = new RelayCommand(() => CurrentToolView = new EffectsView()); 
     AddTextCommand = new RelayCommand(() => CurrentToolView = new AddTextView()); 
     ResizeCommand = new RelayCommand(() => CurrentToolView = new ResizeView()); 
     CropViewCommand = new RelayCommand(() => CurrentToolView = new CropView()); 
     RedEyeCommand = new RelayCommand(() => CurrentToolView = new RedEyeView()); 
     RotateViewCommand = new RelayCommand(() => CurrentToolView = new RotateView()); 
     ExitCommand = new RelayCommand(() => Application.Current.Shutdown()); 
     FullscreenCommand = new RelayCommand(() => 
               { 
                var fs = new FullscreenView 
                    {FullscreenImage = CurrentImage.LoadedImage}; 
                fs.Show(); 
               }); 
     HandleDropCommand = new RelayCommand<DragEventArgs>(e => OnFileDrop(this, e)); 
     Messenger.Default.Register<User>(this, "UserLogin", SetUser); 
     Messenger.Default.Register<FlickrAccount>(this, "AddedAccount", AddAccount); 
     Messenger.Default.Register<string>(this, "INeedAUser", SendUser); 
     Messenger.Default.Register<string>(this, "INeedAImage", SendImage); 
    } 
+0

मुझे भी इसका अच्छा जवाब देखने में दिलचस्पी है, लेकिन AFAIK यह सभी ढीले युग्मन भलाई के लिए भुगतान करने की कीमत है। – Jon

उत्तर

5

तो आप के लिए आदेशों है:

  1. फ़ाइल आपरेशन (ओपन, सहेजें, झिलमिलाहट पर अपलोड करें)

  2. विंडो संचालन (पूर्ण स्क्रीन, बंद)

  3. संपादन (घूर्णन, आकार बदलना, रंग, आदि)

समूह (कॉम) पर विचार करें प्रस्तुत करना) एक कस्टम क्लास में एक साथ संबंधित आदेशों को उदाहरण के लिए फ़ाइलकॉमैंड्स कहा जाता है। लागू होने पर एक बहु-स्तरीय पदानुक्रम बनाएं। यदि आपके दृश्य में एक पदानुक्रमित मेनू है, तो आप शायद समान कमांड पदानुक्रम चाहते हैं।

फिर, एक नियंत्रक प्रति कमांड समूह (उदाहरण के लिए फ़ाइल नियंत्रक) और नियंत्रक में विधि बनाएं जो फ़ाइलकॉम समूह से संबंधित सेवा के साथ आदेश पंजीकृत करेगा।

कंट्रोलर/व्यूमोडेल मैपिंग को वास्तव में कार्यान्वित करने के तरीके के बारे में कुछ विचारों के लिए http://waf.codeplex.com/ नमूना अनुप्रयोग (उदाहरण के लिए BookController.cs) देखें। ध्यान दें कि यह सटीक एक ही परिदृश्य नहीं है (समूहों में कमांड का कोई तोड़ नहीं)।

+0

बहुत रोचक, मुझे विचार पसंद है। थोड़ा जटिल लगता है (मेरे लिए नौसिखिया के रूप में) लेकिन मैं इसे देख लूंगा और आपको बताऊंगा कि मैं कैसे चला गया! आपके उत्तर के लिए धन्यवाद :) –

+0

यदि आप अभी तक कंट्रोलर नहीं चाहते हैं तो केवल समूह से संबंधित कमांड सुझाए गए हैं और विभाजित करें प्रारंभिक फ़ॉल कॉमैंड्स, प्रारंभिकविंडोमंड्स इत्यादि में प्रारंभिक कॉमांड विधि – surfen

0

आपका ViewModel मतलब देखें और मॉडल के बीच गोंद हो रहा है। इसका तात्पर्य यह है कि, जब तक कि आप सामान्य रूप से मॉडल को पुन: सक्रिय नहीं कर सकते, तब तक इसमें हमेशा 'गोंद-रेखा' की गणना होगी।

एकमात्र अव्यवस्था मैं कल्पना कर सकता हूं कि आप छुटकारा पा सकते हैं यदि आपको XXXCommand गुणों की वास्तविकता की आवश्यकता नहीं है; उस स्थिति में, आप संपत्ति की तरह, (छद्म कोड)

private void createCommands() { 
    var commands={ 
     "Logout"=>new RelayCommand(Logout), 
     "Exit"=>new RelayComand(()=>Application.Current.Shutdown()), 
    .... 
    }; 
    foreach(var key,cmd in commands){ 
     glue(key,cmd); 
    } 
}; 

कोई अन्य वस्तुओं आप उन्हें सही देखें glueing के अलावा यहाँ बनाने के लिए संदर्भ रखने के लिए कारण नहीं है जैसी संरचनाओं का एक संग्रह बना सकते हैं जिल्दसाज़।

लेकिन फिर, इस के लिए संपत्ति मुहावरे का उपयोग क्यों नहीं करें? दोबारा: अव्यवस्था की मात्रा, जैसा कि मैंने इसे देखा, उचित रूप से सीमित है।

+0

आपके उत्तर के लिए धन्यवाद, मैं कोड को फिर से देखूंगा साथ ही साथ अपने शिक्षक से पूछूंगा।मैं बाद में कोड दोबारा पोस्ट करूंगा और आप परिणाम देख सकते हैं :) –

+0

बस एक नोट: तारों में नाम होने से उन्हें कंपाइलर के लिए अदृश्य बना दिया जाता है (यानी यह स्थिरता की जांच नहीं कर सकता)। दूसरी ओर; यह भी जांच नहीं कर सकता कि संपत्ति का उपयोग किया जाता है या नहीं ... – FrankB

1

कैलिब्रॉन माइक्रो का उपयोग करें। नाम = "लॉगआउट" नामक बटन के लिए व्यूमोडेल में आवश्यक एकमात्र चीज लॉगआउट नामक एक सार्वजनिक विधि है।

और convetion बाइंडिंग के बिना:

<Button Content="Remove" 
     cal:Message.Attach="[Event Click] = [Action Remove($dataContext)]" /> 

फिर ViewModel पर एक विधि नामित निकालें जोड़ सकते हैं और है कि नमूने में DataContext विधि को पारित कर दिया है।

+0

कैलिबर्न माइक्रो क्या है, और यह कितना आसान है यह? वर्तमान में हम एमवीवीएम लाइट का उपयोग कर रहे हैं, क्या उन्हें एक साथ इस्तेमाल किया जा सकता है? आपकी प्रतिक्रिया के लिए धन्यवाद :) –

+0

सीएम डब्ल्यूपीएफ और एसएल के लिए एक सम्मेलन आधारित एमवीवीएम फ्रेमवर्क है। http://caliburnmicro.codeplex.com/। प्रारंभ करना बुरा नहीं है लेकिन मुझे नहीं लगता कि आप दोनों एक ही समय में उपयोग करेंगे। –

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