2011-10-10 20 views
13

मुझे हाल ही में एक समस्या का सामना करना पड़ा है जहां मेरे पास एक ObsVableCollection एक सूची दृश्य से जुड़ा हुआ है। लोग एक संरचना है जिसे मैंने लिखा है। जब तक मैं बाध्यकारी से पहले लोगों की वस्तुओं का मूल्य निर्धारित करता हूं, तब तक सब कुछ ठीक काम करता प्रतीत होता है। हालांकि, जब मैं रनटाइम पर जीयूआई से मान सेट करने का प्रयास करता हूं, तो अंतर्निहित वस्तुएं परिवर्तन को प्रतिबिंबित नहीं करती हैं।एक संरचना के लिए बाध्यकारी क्यों काम नहीं करता है?

अंत में मैंने लोगों को संरचना से कक्षा में बदलकर इस समस्या को पार कर लिया। कोई अन्य बदलाव जरूरी नहीं था।

क्या कोई मुझे बता सकता है कि यह क्यों है?

+5

आप struct और वर्ग के बीच अंतर पता है? –

उत्तर

21

आपकी बाध्यकारी संरचना की एक प्रति प्राप्त करती है क्योंकि structs विधियों के मूल्य से गुजरती हैं। यदि बाध्यकारी कुछ अद्यतन करता है; स्मृति में एक प्रति कहीं संशोधित की जा रही है और इसलिए आपकी मूल वस्तु अपडेट नहीं की गई है।

2

क्योंकि संरचना नियंत्रण के मूल्य से गुजरती है, इसलिए जब आप यूआई में परिवर्तन करते हैं, तो डब्ल्यूपीएफ People के एक अलग उदाहरण में परिवर्तन लिखता है।

इसे कक्षा में बदलें और यह काम करेगा।

जब तक आप struct के उद्देश्य को पूरी तरह से समझ नहीं लेते हैं, तो मैं इसका उपयोग नहीं करने का सुझाव देता हूं।

2

ListView एक ItemsControl है और या तो प्रत्यक्ष मोड में काम करता है जहां आप पॉप्युलेट यह XAML में या ItemsSource मोड में severl ListViewItem वस्तुओं जहां ItemsSource संपत्ति

See this Dr. WPF article for a good explanation पर एक बाध्यकारी सेट की घोषणा के द्वारा आइटम है।

किसी भी तरह से, ListView.Items एक आइटम चयन है जो एक संग्रह दृश्य है, यानी आइटम आइटम संग्रह स्रोत को वास्तविक संग्रह नहीं है, लेकिन आपके द्वारा प्रदान किए गए संग्रह की सामान्य प्रतिलिपि जो फ्रेमवर्क को उदाहरण के लिए एक्सेस करने की अनुमति देती है इंडेक्स द्वारा अंतर्निहित IENumerable हालांकि आईनेमरेबल एक इंडेक्सर स्वयं प्रदान नहीं करता है।

चूंकि लिस्ट व्यू एक प्रति का उपयोग करता है, जब यह क्लास इंस्टेंस के संग्रह का उपयोग कर रहा है, तो यह संदर्भों की प्रतियां बना सकता है, दोनों संदर्भ स्मृति में एक ही वस्तु को इंगित करते हैं ताकि संदर्भों में से किसी एक में मूल्य बदलने के प्रभाव दिखाई दे सकें अन्य संदर्भ के माध्यम से, लेकिन जब यह structs के संग्रह का उपयोग कर रहा है जो मूल्य प्रकार हैं, तो उन्हें एक ही ऑब्जेक्ट को इंगित करने वाले दो संदर्भ होने के बजाय मूल्यों की प्रतियां बनाना पड़ता है, फिर आपके पास दो अलग-अलग मान प्रकार वस्तुएं होती हैं।

1

इस विषय में सभी रुचि रखने वालों के लिए: मुझे इसे एक Combobox और Objectdataprovider के साथ चल रहा है। "आइटमसोर्स" संरचना है, लेकिन "चयनित इटिम" कहीं और लिखा गया है। संदेश यह है:

<!--resources--> 
    <ObjectDataProvider x:Key="StructValues" 
         MethodName="GetValues" 
         ObjectType="{x:Type local:MyStruct}"> 
     <ObjectDataProvider.MethodParameters> 
      <x:Type TypeName="local:MyStruct" /> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 

    <ComboBox Margin="0,5" 
         VerticalAlignment="Center" 
         ItemsSource="{Binding Source={StaticResource StructValues}}"/> 

और यह कैसे struct की तरह लग रहा है:

public struct MyStruct 
{ 
    public const string A = "A"; 
    public const string B = "B"; 
    public const string C = "C"; 

    public static IEnumerable GetValues(Type type) 
    { 
     List<String> retVals = new List<string>(); 
     FieldInfo[] fi = type.GetFields(); 
     foreach (FieldInfo info in fi) 
     { 
      retVals.Add(info.Name); 
     } 
     return retVals; 
    } 
} 
संबंधित मुद्दे