2011-04-06 17 views
8

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

मैंने एक सेवा बनाई है जो एक दृश्य मॉड्यूल उनके लिए प्रासंगिक रिबन आइटम जोड़ने के लिए पंजीकरण कर सकता है, और इसके अतिरिक्त, कोई भी मुख्य दृश्य उदाहरण उस उदाहरण के लिए प्रासंगिक अपने रिबन आइटम प्रदान कर सकता है। एक रिबन इटैम एक छोटी सी कक्षा है जो रिबन आइटम के विकल्पों को सारणी देती है, और मुख्य रूप से शीर्षक, विवरण, कमान, यूआईटीपी और चाइल्ड इटम्स है। जब मुख्य दृश्य बदलता है तो सेवा रिबन के पुनर्निर्माण के लिए प्रभारी होती है।

मेरा एक सहयोगी सोचता है कि यह खराब एमवीवीएम है, क्योंकि उपयोगकर्ताओं को सी # कोड में अपने रिबन दृश्य को डिजाइन करने की आवश्यकता है, न कि एक्सएएमएल में, और वह यह भी कहता है कि आइटमों को अक्षम या सक्षम करने के लिए इस तरह से कठिन होगा एक बार, क्योंकि इन वस्तुओं के प्रत्येक कमांड को इसके CanExecute को अलग से अपडेट करने की आवश्यकता होगी। इसके बजाए, उन्होंने एक मुख्य रिबन व्यू और व्यूमोडेल फाइलें रखने का सुझाव दिया, जहां प्रत्येक डेवलपर जो उसके मॉड्यूल या व्यू के लिए रिबन बटन जोड़ना चाहता है उसे व्यू एक्सएएमएल में जोड़ने और व्यूमोडेल में एक प्रासंगिक कमांड जोड़ने की आवश्यकता होगी। इसके अलावा, VisualStates का उपयोग यह निर्धारित करने के लिए किया जाएगा कि ViewModel में परिवर्तनों के आधार पर कौन से आइटम प्रदर्शित किए जाएंगे या सक्षम होंगे (जैसे दृश्य परिवर्तन, या चयन परिवर्तन)। मुझे वास्तव में यह समाधान पसंद नहीं है, मुख्य रूप से क्योंकि सभी डेवलपर्स को एक बार बड़ी फाइल में अपने मॉड्यूल ज्ञान रखना होगा।

ध्यान दें कि रिबन में कुछ आइटम (जैसे विकल्प, निकास) पूरे एप्लिकेशन के लिए आम हैं, जबकि कुछ विशिष्ट एप्लिकेशन डोमेन से प्रासंगिक हैं और कुछ केवल विशिष्ट दृश्य के लिए प्रासंगिक हैं।

संपादित करें: मुझे लगता है कि मेरा मुख्य प्रश्न यह है कि कई विकास टीमों को एक रिबन पर एकीकृत करने की अनुशंसित तरीका क्या है? क्या हमारे पास एक सिंगल रिबन व्यू और सिंगल रिबन व्यूमोडेल होना चाहिए जिसमें रिबन में सभी संभावित आइटम होंगे, और प्रत्येक टीम इन आइटमों को इन वी/वीएम में जोड़ देगी और उन्हें दिखाने के लिए तर्क को परिभाषित करेगी (शायद दृश्य स्थिति का उपयोग करके) ? या क्या हम प्रत्येक व्यू, व्यू-मॉडल या मॉड्यूल को रिबन आइटम (अपने स्वयं के सी # कोड के भीतर) सेवा के खिलाफ पंजीकरण करते हैं, और उस सेवा में तब आवश्यक रिबन प्रस्तुत करते हैं जब उस दृश्य में पंजीकृत सभी आइटमों के साथ सक्रिय दृश्य बदलता है? या क्या इस एकीकरण को हासिल करने का कोई बेहतर तरीका है?

आपको क्या लगता है? क्या आपके पास एक बेहतर विचार है या एक एकल रिबन संसाधन को प्रबंधित करने के बारे में एक राय है जो एकाधिक डेवलपर्स के लिए आम है?

धन्यवाद, splintor

+1

खैर, ViewModels को रिबन के बारे में कुछ भी "पता" नहीं होना चाहिए। उन्हें रिबन में क्या दिखाना है और प्रदर्शित नहीं किया जाना चाहिए। यह देखने के लिए कि व्यू और क्या नहीं दिखाना है, व्यू व्यूमोडेल के राज्य परिवर्तनों का जवाब देना चाहिए। – Will

+0

इसका मतलब क्या है "रिबन पुनर्निर्माण"? यदि आपके पास अलग-अलग विचारों के लिए अलग-अलग रिबन हैं, तो यह अच्छा अभ्यास नहीं है, क्योंकि रिबन केवल एक होना चाहिए। आपका सहयोगी सही है। और मैं रिबन को बदलने के लिए केवल एक डेवलपर को अनुमति दूंगा। – vorrtex

+0

यह एक टैबबड एप्लिकेशन है, जिसमें कई टैब प्रकार होते हैं - प्रत्येक प्रकार के अपने रिबन कमांड होते हैं। रिबन में सभी वस्तुओं को रखने के बजाय, मैंने सोचा कि टैब के परिवर्तन आसान होने पर प्रासंगिक वस्तुओं के साथ रिबन सामग्री का पुनर्निर्माण करना आसान होगा। आप जो कहते हैं उसके विपरीत, मेरे सहयोगी का कहना है कि हर कोई मुख्य रिबन फाइलों में अपना हिस्सा संपादित करता है, क्योंकि प्रत्येक डेवलपर जानता है कि वह अपनी रिबन वस्तुओं को कैसे देखना चाहती है। मुझे वास्तव में दो बड़ी फाइलें रखने का विचार पसंद नहीं है जो पूरे एप्लिकेशन और इसकी स्क्रीन के बारे में ज्ञान को केंद्रित करते हैं - यह एक बड़ा एप्लीकेशन है और हमें इसे यथासंभव विघटित करने की आवश्यकता है। – splintor

उत्तर

1

मैं विल की टिप्पणी से सहमत हैं, अपने viewmodel परवाह या पता है कि यह कैसे गाया जा रहा है या नहीं करना चाहिए डिजाइनरों कभी बदलने के लिए कि यह कैसे प्रदान की गई है तय है।

एक व्यू मॉडेल में प्रस्तुत करने के लिए प्रस्तुति परत के लिए केवल सभी आवश्यक जानकारी होनी चाहिए।

तो व्यूमोडेल में उन सभी गुणों का होना चाहिए जो रिबन बार को कार्य करने के लिए बाध्य करने की आवश्यकता है। फिर आप इसे प्रस्तुत करने के लिए resource.xaml या कुछ अन्य रणनीति का उपयोग कर सकते हैं।

अंधेरे में एक शॉट ले रहा है मैं ViewModels के लिए कुछ इस तरह की कोशिश करेंगे:

public interface IMenuViewModel : INotifyPropertyChanged 
{ 
    ICommand Command {get;} 
    string Title {get;} 
    string Description {get;} 
    UIType Type {get;} 
    IList<IMenuViewModel> ChildItems {get;} 
} 

मैं तो शायद एक अमूर्त वर्ग है कि एक संग्रह वर्ग औजार INotifyCollectionChanged की देखभाल करने के साथ लागू करता INotifyPropertyChanged प्रदान करता है पैदा करेगा नलसाजी कोड।

मैं तो शायद Resources.xaml

<DataTemplate DataType="{x:Type vm:IMenuViewModel}"> 
    <StackPanel> 
    <Button Command="{Binding Command}" Content="{Binding Type}"/> 
    <ItemsControl ItemsSource="{Binding ChildItems}"/> 
    </StackPanel> 
</DataTemplate> 

में कुछ इस तरह करना होगा अपने ViewModels

और फिर सभी किसी को अपने रिबन में एक प्रविष्टि बनाने के करना है के लिए एक डिफ़ॉल्ट दृश्य प्रदान करने के लिए बार

1) को लागू करें IMenuViewModel

2) वैकल्पिक रूप से एक और DataTemplate प्रविष्टि अपने resources.xaml में जोड़ने अगर वे वा है एनटी उनके विजेट को अलग तरह से प्रस्तुत किया गया:

<DataTemplate DataType="{x:Type vm:FooViewModel}"> 
    <v:FooView /> 
</DataTemplate> 

मुझे आशा है कि मैं इस पर गहराई से खोद नहीं पाएगा कि मैं कैसे कार्यान्वित करूंगा।

मुख्य मुद्दा यह है कि एक ViewModel केवल यह काम है करने के लिए देखने के लिए आवश्यक गुण (जो ViewModel प्रतिपादन किया जाता है) को बेनकाब करना चाहिए, ViewModel के लिए नहीं काम करते हैं या परवाह कि यह कैसे हुआ है।

+0

मुझे लगता है कि आप मेरा मुख्य बिंदु चूक गए हैं - मैं अपना प्रश्न स्पष्ट करने के लिए एक अद्यतन जोड़ दूंगा। – splintor

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