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

Popular posts from this blog

MySql variables and php -

url rewriting - How to implement the returnurl like SO in PHP? -

Which Python client library should I use for CouchdB? -