2011-02-06 24 views
9

मैं एमवीवीएम के लिए नया हूं और मैंने आगे बढ़ने का फैसला किया है और मेरी आगामी परियोजनाओं में इसे अपनाना शुरू कर दिया है।एमवीवीएम में व्यू मोड और एडिट मोड के बीच स्विचिंग?

मैंने इस संबंधित प्रश्न और उत्तर को पढ़ा है, लेकिन मुझे नहीं पता कि यह एमवीवीएम के साथ कैसे लागू किया जाएगा।

मैं अपने प्रोजेक्ट में सभी विचारों को 2 मोड, संपादन मोड और व्यू मोड के लिए चाहता हूं।
मैं नहीं चाहता कि उपयोगकर्ता सभी क्षेत्रों के लिए टेक्स्टबॉक्स को डिफ़ॉल्ट रूप से देखना चाहें, मैं चाहता हूं कि वे टेक्स्टब्लॉक देखें (या सभी TextBoxe एस 'को IsReadOnly संपत्ति के रूप में सत्य (शैली आदि के माध्यम से आप मुझे बताएं ..)

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

मुझे पूरा यकीन है कि मैं इस मुद्दे के साथ अकेला नहीं हूं, मैं सुनना चाहता हूं विशेषज्ञों से बी स्विच करने का सबसे प्रभावी तरीका क्या है शुद्ध मोड में इन मोड के बीच, और इसके लिए दो अलग-अलग विचार घोषित करना आम है या नहीं।

कृपया मुझे एक अच्छा लेख देखें जो बताता है कि यह कैसे करें (शायद यह विजुअल स्टेट द्वारा किया जाता है ?? आईडीके)।

अद्यतन
मैं जानना चाहता हूँ क्या नहीं बल्कि कैसे की तुलना में, मेरे सवाल का पैटर्न के बारे में है, और मैं या तो वी या वी एम पर संपादन मोड बांट देना चाहिए देखें मोड से है? तो कृपया अपने उत्तर में इस विवरण पर जोर दें।

अग्रिम धन्यवाद। true को

public bool IsViewMode 
{ 
    get { return _IsViewMode; } 
    set 
    { 
     _IsViewMode= value; 
     // Call NotifyPropertyChanged when the source property is updated. 
     NotifyPropertyChanged("IsViewMode"); 
    } 
} 

IsViewMode चूक और चालू किया जाये:

उत्तर

10

अपने पाठ बॉक्स IsReadOnly संपत्ति का उपयोग करें और "संपादन मोड" संपत्ति के लिए बाध्य है कि:

<TextBox .... IsReadOnly={Binding IsViewMode} ... /> 
फिर अपने दृश्य मॉडल में

false पर जब उपयोगकर्ता "संपादन" पर क्लिक करता है। बाध्यकारी तुरंत सभी पाठ बॉक्स संपादन योग्य बना देगा।

आप अन्य नियंत्रणों के लिए भी ऐसा ही कर सकते हैं - हालांकि यह IsEnabled संपत्ति होगी जो आपको इन मामलों में बाध्य करने की आवश्यकता है - हालांकि आप नियंत्रण को गहरा कर देते थे।

पाठ ब्लॉक और अपने नियंत्रण बाहर स्वैप करने के लिए आप कन्वर्टर्स की एक जोड़ी के माध्यम से दोनों नियंत्रण एक ग्रिड में एक ही स्थान साझा करने और उनकी दृश्यता IsViewMode संपत्ति के द्वारा नियंत्रित की आवश्यकता होगी:

<TextBlock Grid.Row="1" Grid.Column="2" ... 
      Visiblity={Binding IsViewMode, Converter=DirectConverter} ... /> 
<ComboBox Grid.Row="1" Grid.Column="2" ... 
      Visiblity={Binding IsViewMode, Converter=InvertedConverter} ... /> 

प्रत्यक्ष कनवर्टर है:

return IsViewMode ? Visibility.Visible : Visibility.Collapsed; 

औंधा कनवर्टर है:

return IsViewMode ? Visibility.Collapsed : Visibility.Visible; 
+0

और अन्य क्षेत्रों के बारे में क्या? मैंने कहा कि मैं कुछ फ़ील्ड को ड्रॉपडाउन में घुमाने के लिए चाहता हूं, कुछ स्लाइडर पर, कुछ डेट पिकर के लिए, जबकि व्यू मोड में वे सभी साधारण टेक्स्टब्लॉक/लेबल हैं? और यह मेरे लिए एक बहुत ही अनिवार्य हिस्सा है। – Shimmy

+0

@Shimmy - क्षमा करें, मुझे उस बिट को याद आया (क्यों नहीं पता)। आप कॉम्बोबॉक्स के लिए भी ऐसा ही कर सकते हैं, लेकिन यह 'IsEnabled' संपत्ति हो सकती है जिसे आपको बाध्य करने की आवश्यकता है। – ChrisF

+0

तो तुम मूल रूप से कह रहे हैं मैं संपादित/दृश्य मोड के लिए एक आम दृश्य करना चाहिए, सभी नियंत्रण होने वीएम पर IsViewMode को IsReadOnly या दृश्यता नियंत्रण स्थापित करने (BooleanToVisibility कनवर्टर का उपयोग कर नियंत्रण को छिपाने के लिए के लिए) अन्य के पास से एक घोषित, है कि सही? ** मैंने अपने प्रश्न में कुछ सामग्री जोड़ दी है। ** – Shimmy

2

व्यूमोडेल: मैं निश्चित रूप से एक दृश्य दृश्य के साथ केवल एक व्यूमोडल रखूंगा जैसा कि क्रिसफ़ के उत्तर में वर्णित है। अलग दृश्य मॉडल सिर्फ सुरुचिपूर्ण होंगे।

देखें: जैसा कि मैंने इसे देखा है, आपके पास विभिन्न पेशेवरों और विपक्ष के साथ कम से कम तीन विकल्प हैं।

  1. क्रिसफ़ के उत्तर में सुझाए गए अनुसार सभी नियंत्रणों को केवल पढ़ने के लिए। पेशेवर: करने के लिए सबसे सरल बात। विपक्ष: यह मेरी विनम्र राय में एक बदसूरत यूआई है।

  2. पृथक कंटेनर में पृथक्करण डिस्प्ले और नियंत्रण संपादित करें। ViewMode में कंटेनर की दृश्यता को बाध्य करें। पेशेवर: यहां एक और अधिक आकर्षक यूई अनुभव का भुगतान किया जा सकता है। आप संक्रमणों को एक से दूसरे तक भी एनिमेट कर सकते हैं। विपक्ष: नियंत्रण की संख्या को दोगुना करता है (बहुत बड़ी खिड़कियों के लिए प्रदर्शन को नुकसान पहुंचा सकता है)। दो कंटेनरों के अंदर नियंत्रण को उसी पिक्सेल स्थितियों पर स्थित करना तरल पदार्थ ui में थोड़ा गैर-तुच्छ हो सकता है।

  3. xaml में प्रत्येक संपादन नियंत्रण के लिए, इसके ऊपर एक प्रदर्शन नियंत्रण रखें। ViewMode संपत्ति के लिए दृश्यता बाध्य करें। पेशेवर: कम से कम लेबल नियंत्रणों का कोई डुप्लिकेशंस इतना तेज़ नहीं है। विपक्ष: एनीमेशन सामान और अन्य दृश्य सही करने के लिए मुश्किल है।

संपादित करें: प्रदान की स्पष्टीकरण को देखते हुए, मैं के रूप में यह काफी बड़े पैमाने पर कैसे साथ और क्या नहीं निपटा पिछले जवाब को बदलने के लिए चुना है।

+0

मैंने अपने प्रश्न में कुछ सामग्री जोड़ दी है। मैं इसे इस तरह घोषित नहीं करूंगा। मुझे नफरत है ViewModel जानता है कि एक दृश्यता गणन है कि वहाँ ... मैं पालन करेगा [ChrisF के जवाब] (http://stackoverflow.com/questions/4917047/switching-between-view-mode-and-edit-mode-in -एमवीवीएम/4 9 17104 # 4 9 17104) बूलियन टॉविसिबिलिट/बूलेनफ्लैगस्विच कन्वर्टर्स इत्यादि का उपयोग करके। मुझे अभी मेरा जवाब मिला है कि व्यू मोड और एडिट मोड को वैसे भी अलग नहीं किया जाना चाहिए। – Shimmy

+0

@Shimmy: मुझे लगता है कि जब तक प्रदर्शन और संपादन मोड में एक ही viewmodel करने के लिए एक ही दृश्य वर्ग और बाध्य से संबंधित होना चाहिए, उनके लिए नियंत्रण के लिए एक बेहतर अनुभव के लिए ui अलग किया जाना चाहिए। मैंने इसे प्रतिबिंबित करने के लिए जवाब बदल दिया है। – anshul

+1

दृश्य मॉडल के साथ बिल्कुल कुछ भी गलत नहीं है यह जानकर कि दृश्यता जैसी कोई चीज़ है। –

3

मुझे इस बारे में लगता है: दृश्य यह कैसा दिखता है, और व्यूमोडेल यह है कि यह उपयोगकर्ता के साथ कैसे इंटरैक्ट करता है। चूंकि एक पठनीय इंटरफ़ेस में पढ़ने/लिखने वाले इंटरफ़ेस की तुलना में काफी अलग व्यवहार होता है, तो दो अलग-अलग व्यूमोडल्स होना चाहिए।

अब मैंने एक व्यू ViewModel बनाया है जो एक प्रदर्शन ViewModel से विरासत में मिला है क्योंकि मैंने संपादन कार्यक्षमता को प्रदर्शन कार्यक्षमता का विस्तार माना है। यह सरल सीआरयूडी प्रकार के अनुप्रयोगों के लिए काम करता है जहां उपयोगकर्ता सीधे व्यवसाय तर्क के बिना फ़ील्ड संपादित कर रहा है।

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

+0

वास्तव में, मैं CRUD बात कर रहा हूँ। जैसा कि मैंने कहा मैं MVVM करने के लिए नया हूँ और यह सीखना चाहते हैं। तुम मुझे कैसे एक CRUD आवेदन MVVM तरीका लागू करने के लिए पर एक अच्छा लेख का संदर्भ लें कर सकते हैं? मेरी समस्या भी बीच संक्रमण है अलग-अलग विचार। – Shimmy

+0

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

+1

@ शिमी - मैं सुझाव देता हूं [उन्नत एमवीवीएम] (http://joshsmithonwpf.wordpress.com/advanced-mvvm/) जोश स्मिथ द्वारा। यह छोटा है, लेकिन बहुत ही जानकारीपूर्ण है और आप स्रोत कोड प्राप्त कर सकते हैं। –

3

क्रिसफ़ का उत्तर ठीक है यदि आप IsReadOnly मार्ग पर जाना चाहते हैं। यदि आप टेक्स्टब्लॉक-टू-टेक्स्टबॉक्स मार्ग पर जाना चाहते हैं, हालांकि, सबसे कुशल तरीके से एक नियंत्रण है जो IsInEditMode या IsInViewModel प्रॉपर्टी के मान के आधार पर ट्रिगर के माध्यम से अपने टेम्पलेट को स्विच करता है।

2

सबसे पहले, मुझे लगता है कि IEditableObject लागू किया और BeginEdit, EndEdit, और CancelEdit के लिए उपयुक्त आदेशों से अवगत कराया मेरे विचार मॉडल के लिए एक सार आधार वर्ग को लागू होगी। ऐसा हो सकता है कि उन तीन तरीकों के लिए वास्तविक कार्यान्वयन व्युत्पन्न कक्षाओं तक होना चाहिए, लेकिन आदेश बेस क्लास में रह सकते हैं।

इस दृष्टिकोण में, EndEdit दृश्य मॉडल में संपत्तियों की वर्तमान मूल्यों के साथ मॉडल अद्यतन करता है।

मैं भी डेटा चलाता में उपयोग के लिए, आधार वर्ग में एक बूलियन IsEditing संपत्ति को लागू होता है तो यह है कि अगर मैं (माना) एक मॉडल संवाद खोले बिना मोड के बीच स्विच करना चाहते हैं, मैं सिर्फ यह एक शैली में क्या कर सकते हैं ।

जहां तक ​​फ्रंट-एंड का दृश्य डिज़ाइन है, मुझे लगता है कि केवल पढ़ने-योग्य दृश्य केवल पढ़ने-योग्य नियंत्रणों के साथ एक संपादन दृश्य है जो मुख्य रूप से प्रोग्रामर के लिए अपील करता है। आम तौर पर, यदि आप किसी उपयोगकर्ता को ऑब्जेक्ट पेश कर रहे हैं, तो उस प्रस्तुति का लक्ष्य उपयोगकर्ता को उस ऑब्जेक्ट में जानकारी के सूचनात्मक, स्पष्ट और सहज ज्ञान युक्त प्रतिनिधित्व प्रदान करना है। यदि आप उपयोगकर्ता को किसी ऑब्जेक्ट को संपादित करने दे रहे हैं, तो उस प्रस्तुति का लक्ष्य ऑब्जेक्ट के सभी संपादन योग्य गुणों को यथासंभव आसान और स्पष्ट रूप से संशोधित करने का कार्य करना है।

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

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