2009-10-27 18 views
6

मैं अपने यूजर इंटरफेस में डब्ल्यूपीएफ और एमवीवीएम पैटर्न का उपयोग कर रहा हूं। मेरे व्यूमोडेल में मेरे पास मिलीमीटर में दूरी वाली एक सूची है, जिसे मैं ListView.ItemsSource को सूची में बाध्य करके ListView में प्रदर्शित करता हूं। हालांकि, मैं "मेट्रिक" चेकबॉक्स की स्थिति के आधार पर मीटर या पैरों को अधिक प्राकृतिक इकाई का उपयोग करने के लिए प्रदर्शित मूल्यों को पसंद करूंगा।डब्ल्यूपीएफ और एमवीवीएम: रनटाइम पर डेटा बाइंडिंग कनवर्टर बदलना

मैंने कुछ सरल वर्ग, मिलिमेट्रेस टॉमेटर्स कनवर्टर और मिलिमेटर्स टॉफेट कनवर्टर लिखा है, जिनमें से दोनों IValueConverter को लागू करते हैं। हालांकि मैं कनवर्टर प्रॉपर्टी को अपने डेटा पर एक या दूसरे पर बाध्यकारी सेट कर सकता हूं, लेकिन मुझे यकीन है कि इन कन्वर्टर्स के बीच कैसे बदलाव करना है जब चेकबॉक्स की स्थिति बदलती है।

मेरी योजना मेरे व्यूमोडेल पर "IValueConverter लंबाई कनवर्टर" फ़ील्ड होना था, जिसे मैं एक कनवर्टर या दूसरे पर सेट कर सकता था, फिर मेरे एक्सएएमएल में ...="{Binding Converter={Binding Path=lengthConverter}}" - दुर्भाग्यवश यह काम नहीं करता क्योंकि कनवर्टर निर्भरता संपत्ति नहीं है।

रनटाइम पर डेटा बाध्यकारी द्वारा उपयोग किए गए कनवर्टर को कैसे बदला जा सकता है?

+0

आप DependencyObject.GetBinding (निर्भरता प्रॉपर्टी) का उपयोग करने में सक्षम होना चाहिए, उदा। बाइंडिंग ऑब्जेक्ट प्राप्त करने (और संशोधित) करने के लिए myTextBlock.GetBinding (TextBlock.TextProperty)। – Heinzi

+0

दुर्भाग्यवश, एमवीवीएम पैटर्न का पालन करने का अर्थ है कि कोड को व्यूमोडेल में रहने की आवश्यकता होगी - जिसमें दृश्य का कोई संदर्भ नहीं है और इस प्रकार "myTextBlock" को स्पर्श नहीं किया जा सकता है। – user200783

उत्तर

0

यदि मैं एक साधारण वैकल्पिक समाधान का सुझाव दे सकता हूं: अपने व्यूमोडेल में एक छोटा FormatMillimetresConverter बनाएं, जिसका UseMetric संपत्ति "मीट्रिक" चेकबॉक्स से जुड़ी है।

+0

धन्यवाद - लेकिन एक बार जब मुझे ViewModel में FormatMillimetresConverter मिल गया है, तो मैं इसका उपयोग करने के लिए ListView कैसे प्राप्त करूं? – user200783

+0

अच्छा बिंदु। :-) आप इसे अपने व्यूमोडेल की स्थिर संपत्ति के रूप में एक उदाहरण निर्यात कर सकते हैं और उसके बाद इसे "... कनवर्टर = {x: स्टेटिक लोकल: व्यूमोडेल.मीफॉर्मैटमिलिमेटर्स कनवर्टर}" के माध्यम से एक्सेस कर सकते हैं, लेकिन किसी भी तरह से यह बहुत ही सुरुचिपूर्ण नहीं है ... – Heinzi

+0

में FormatMillimetresConverter बनाने के बारे में क्या? फिर यह एक स्थिर संसाधन के रूप में उपलब्ध है और आप इसे सूची दृश्य में कनवर्टर के रूप में संलग्न कर सकते हैं। "... कनवर्टर = {स्टेटिक रिसोर्स ..." और "{बाइंडिंग स्रोत = {स्टेटिक रिसोर्स ..." के साथ चेकबॉक्स में। – Heinzi

5

एमवीवीएम पद्धति का उपयोग करते समय अधिकांश समय, आप वीएम कक्षाओं में स्वरूपण कार्य कर सकते हैं। आपके मामले में, आप वीएम कक्षा में एक प्रारूप संपत्ति जोड़ सकते हैं, और प्रारूप संपत्ति के मूल्य के आधार पर, एक अच्छी तरह से तैयार स्ट्रिंग वापस कर सकते हैं।

अधिक जानकारी के लिए this discussion देखें।

+0

बिल्कुल। कन्वर्टर्स एक एमवीवीएम अनुप्रयोग में बहुत दुर्लभ होते हैं, आमतौर पर केवल कस्टम नियंत्रण में पॉप अप करते हैं। –

+0

मान लीजिए कि मेरे व्यू मॉडेल में 'सूची डिस्टेंस' संपत्ति है जो मैं अपनी ListView.ItemsSource को बाध्य कर रहा हूं। क्या आप सुझाव दे रहे हैं कि डिस्टेंस की बजाय। सूची को वापस लौटने के लिए, इसे एक अलग सूची वापस करनी चाहिए - रूपांतरण पहले ही लागू हो चुका है? – user200783

+0

@ पॉल: हाँ। एक व्यूमोडेल बस थोड़ा सा मूल्य कनवर्टर है ;-)। आप डब्ल्यूपीएफ शिष्यों के चर्चा बोर्ड पर एक समान चर्चा पढ़ सकते हैं: http://groups.google.com/group/wpf-disciples/msg/c29b3935ec9d3c4e –

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