c# - ComboBox with IEnumerable<Brush> as ItemsSource and SelectedItem exception -
मेरे पास कॉम्बोबॉक्स के साथ यह मुद्दा है जो IEnumerable & lt; brush & gt;
आइटमों के रूप में; समस्या तब होती है जब मैं (प्रोग्रामेटिक रूप से) SelectedItem को सेट करने का प्रयास करता हूं यहां कोड है जो समस्या का वर्णन करता है:
निजी रीडोनली सूची & lt; ब्रश & gt; रंग की_; निजी ब्रश white_; ViewModelConstructor () {colors_ = (brushes_type.GetProperties () में पी में से चुनें (ब्रश) कनवर्टर। कनवर्टफ़ोमस्ट्रिंग (पी। नोम))। ToList (); White_ = colors_.Single (b = & gt; बी.ToString () == "#FFFFFFFF"); } सार्वजनिक IEnumerable & lt; ब्रश & gt; रंग {वापस {return colors_; }} सार्वजनिक ब्रश व्हाइट {get {return white_; } सेट {if (white_! = Value) white_ = value; }}
और यहां xaml कोड है:
& lt; कॉम्बो बॉक्स आइटमस्सोर्स = "{बाध्यकारी पथ = रंग}" चयनितआईटम = "{बाध्यकारी पथ = व्हाइट } "& gt; & LT; ComboBox.ItemTemplate & gt; & LT; DataTemplate & gt; & Lt; स्टैकपैनेल ओरिएंटेशन = "क्षैतिज" & gt; & Lt; बॉर्डर बॉर्डरछोटी = "1" बॉर्डरब्रश = "ब्लैक" चौड़ाई = "20" ऊँचाई = "12" स्नैपटोवडिवाइस पिक्सेल = "ट्रू" मार्जिन = "0,0,4,0" & gt; & Lt; सीमा पृष्ठभूमि = "{बाइंडिंग}" / & gt; & Lt; / बॉर्डर & gt; & Lt; टेक्स्टब्लॉक टेक्स्ट = "{बाइंडिंग}" / & gt; & Lt; / StackPanel & gt; & Lt; / DataTemplate & gt; & LT; /ComboBox.ItemTemplate> & Lt; / ComboBox & gt;
व्हाइट संपत्ति पर मिल जाने के बाद मुझे एक अपवाद प्राप्त हुआ है: ऑब्जेक्ट पर कोई संपत्ति सेट नहीं कर सकता #FFFFFFFF क्योंकि यह केवल पढ़ने के लिए राज्य में है । अगर मैं श्वेत (सफेद_) को शून्य के रूप में छोड़ देता हूं, तो सबकुछ ठीक काम करता है।
रिफ्लेक्टर का उपयोग करके मैंने पता लगाया है नीचे जहां समस्या प्रतीत होती है अंदर चयनकर्ता.आइटमसेटऑब्स चयनित
, यह नया चयनित आईटम
लेता है और निम्न करता है:
- यदि कंटेनर तत्व
निर्भरता ऑब्जेक्ट
है, यह कंटेनर सेtrue
परIsSelectedProperty
सेट करता है। - अन्यथा यदि तत्व एक
निर्भरता ऑब्जेक्ट
है, तोIsSelectedProperty
को तत्व सेtrue ।
वह दूसरा भाग है, जहां विफलता खेलने में आता है, आपके द्वारा चुने गए
ब्रश
ऑब्जेक्ट्स केवल पढ़ने के लिए हैं I क्योंकि इस मामले मेंSelector.ItemSetIsSelected
कुछ टूट जाता है, आपके पास दो विकल्प हैं।विकल्प 1 , आप बस ब्रश ऑब्जेक्ट पर कॉल करें। (कनवर्टर से लौटा)।
colors_ = (पी में टाइपफ़ (ब्रश) से)। गेटप्रॉपरटेज़ () का चयन करें (ब्रश) कनवर्टर.कॉन्न्वर्टफ्रेमस्ट्रिंग (पी। )) क्लोन ()) ToList ()।।
संपादित करें: आपको विकल्प 1 के साथ जाना चाहिए ... विकल्प 2 समस्या को ठीक करने का लंबा तरीका है
< मजबूत> विकल्प 2 , आप ब्रश ऑब्जेक्ट को एक और ऑब्जेक्ट में लपेट कर सकते हैं:
सार्वजनिक वर्ग ब्रशवेपर {सार्वजनिक ब्रश ब्रश {get; सेट; }}
फिर आप डेटा टेम्पलेट पथ को अपडेट कर सकते हैं:
& lt; सीमा पृष्ठभूमि = "{बाध्य पथ = ब्रश}" />
और
& lt; टेक्स्टब्लॉक टेक्स्ट = "{बाध्यकारी पथ = ब्रश}" / & gt;
अंत में, आप
ViewModel
:निजी रीडोनली सूची & lt; BrushWrapper & gt; को अपडेट करते हैं। रंग की_; निजी ब्रशविक्रेपर white_; सार्वजनिक रंगदृश्यमोडेल () {colors_ = (पी प्रकार से (ब्रश) में पीट्सप्रोपेर्टीज़ () नए ब्रशवेपर {ब्रश = (ब्रश) कनवर्टर का चयन करें। कॉन्वर्टफ्रमस्ट्रिंग (पी। नेम)})। ToList (); White_ = colors_.Single (b = & gt; बी। ब्रश। टॉस्ट्रिंग () == "# एफएफएफएफएफएफएफ"); } सार्वजनिक सूची & lt; ब्रशवेपर & gt; रंग {वापस {return colors_; }} सार्वजनिक ब्रशविक्रेपर व्हाइट {मिले {वापसी white_; } सेट {if (white_! = Value) white_ = value; }}
Comments
Post a Comment