2010-05-27 16 views
6

अरग, हालांकि मैं गुगल रहा हूं, अगर कोई मेरी समस्या को तोड़ सकता है तो मैं वास्तव में इसकी सराहना करता हूं क्योंकि सभी कोड उदाहरण ऑनलाइन सहायता करने से मुझे अधिक भ्रमित कर रहे हैं (शायद यह देर हो चुकी है) .. ।एक संग्रह ऑब्जेक्ट के साथ डब्ल्यूपीएफ डाटाबेसिंग

मैं एक साधारण वर्ग के रूप में नीचे परिभाषित किया गया है:

public class Person 
{ 
    int _id; 
    string _name; 

    public Person() 
    { } 

    public int ID 
    { 
     get { return _id; } 
     set { _id = value; } 
    } 

    public string Name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 
} 

है कि एक डेटाबेस में संग्रहीत है, और थोड़ा और कोड मैं इसे एक ObservableCollection वस्तु में डाल दिया पर बाद में WPF में DataBind करने का प्रयास करने के माध्यम से:

public class People : ObservableCollection<Person> 
{ 
    public People() : base() { } 

    public void Add(List<Person> pListOfPeople) 
    { 
     foreach (Person p in pListOfPeople) this.Add(p); 
    } 
} 

एक्सएएमएल में, मेरे पास एक सूची दृश्य है कि मैं "लोगों" ऑब्जेक्ट में प्रत्येक आइटम के लिए ListViewItem (टेक्स्टब्लॉक से युक्त) को पॉप्युलेट करना चाहता हूं क्योंकि यह डेटाबेस से अपडेट हो जाता है। मैं उस ऑब्जेक्ट की "नाम" संपत्ति से जुड़ने के लिए उस टेक्स्टब्लॉक को भी पसंद करूंगा।

मैं पहली बार में सोचा था कि मैं ऐसा कर सकता है कि:

lstPeople.DataContext = objPeople; 

जहां lstPeople मेरी XAML में मेरी ListView नियंत्रण है, लेकिन निश्चित रूप से है कि कुछ नहीं करता है। मुझे ऑनलाइन उदाहरणों के टन मिल गए हैं जहां एक्सएएमएल के माध्यम से लोग एक वस्तु बनाते हैं और फिर अपने एक्सएएमएल के माध्यम से इसे बांधते हैं; लेकिन एक ऐसा नहीं है जहां हम एक तत्काल वस्तु से बंधे हों और तदनुसार फिर से खींचे।

कोई मुझे पर कुछ संकेत दे सका:

ए) कैसे मेरी instantiated "लोग" के लिए संग्रह वस्तु एक ListView नियंत्रण बाध्य करने के लिए?

बी) संग्रह में वस्तुओं के लिए इसे प्रारूपित करने के लिए मैं अपनी सूची दृश्य में एक टेम्पलेट कैसे लागू कर सकता हूं?

यहां तक ​​कि एक सभ्य उदाहरण के लिंक (XAML में घोषित ऑब्जेक्ट पर कोई भी ऑपरेटिंग नहीं) की सराहना की जाएगी।

आपके समय के लिए धन्यवाद।

उत्तर

6

आप बहुत करीब थे।

lstPeople.ItemsSource = objPeople; // :) 

आपको केवल एक ही चीज की आवश्यकता है जो आपके संग्रह में प्रत्येक आइटम के लिए एक दृश्य को लागू करने का तरीका है। कोई बात नहीं। मैं ListView का उपयोग नहीं करूंगा ... मैं केवल एक आइटम नियंत्रण का उपयोग करूंगा क्योंकि यह थोड़ा आसान है।

<ItemsControl x:Name="lstPeople"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
       <TextBlock Text="{Binding Name}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

यह बहुत अधिक है। रणनीति सूची सूची के लिए समान है, लेकिन आपको कॉलम हेडर और सामान प्रदान करने के लिए केवल एक और अधिक एक्सएएमएल प्रदान करने की आवश्यकता है। मुझे 100% यकीन नहीं है कि आपको इस समय इसकी आवश्यकता है, इसलिए मैंने इसे छोड़ दिया।

संपादित करें: यहां "AddRange" के लिए एक विस्तार विधि है जो आप पर्यवेक्षण चयन को उपclass करके करने की कोशिश कर रहे हैं। थोड़ा आसान ... खासकर यदि आप (आप होगा)

public static void AddRange<T>(this ObservableCollection<T> collection, IEnumerable<T> items) 
{ 
    foreach(var item in items) 
    { 
      collection.Add(item); 
    } 
} 

तो फिर तुम सिर्फ कर सकते हैं संग्रह प्रकार के एक बहुत कुछ के साथ अंत:

ObservableCollection<Person> peeps = new ObservableCollection<Person>(); 
peeps.AddRange(new List<Person> 
{ 
    new Person() { Name = "Greg" }, 
    new Person() { Name = "Joe" } 
}); 
+0

+1 मेरे पास आपके लगभग एक समान जवाब था। – slugster

+0

आह, हर किसी को उजागर करने के लिए धन्यवाद! – Randster

0

मुझे सेकंड से हराया @Anderson, मेरा उत्तर था मिलता जुलता।

एक बात मैं हालांकि जोड़ देगा: वहाँ संग्रह है कि ObservableCollection से विरासत के एक नए प्रकार परिभाषित करने की आवश्यकता है, बजाय आप सिर्फ यह कर सकते हैं:

ObservableCollection<Person> myPeopleCollection = new ObservableCollection<Person>(); 

केवल समय आप का विस्तार करना चाहते यह है यदि आप इसके साथ कुछ अलग या फैंसी करने जा रहे हैं, जो आप ऐसा नहीं कर रहे हैं।

+0

ओपी अपने संग्रह के लिए एक "AddRange" विधि चाहता था। मैं अक्सर इसे खुद को पर्यवेक्षण चयन पर चाहता था। मैं देख सकता हूं कि आप ऐसा क्यों करेंगे। मैंने एक ही काम करने के लिए ExtensionMethods लिखा है। –

+0

@Anderson - हाँ, मैंने देखा कि पहली नज़र में * जोड़ें * फ़ंक्शन था, जब आपने इसका उल्लेख किया तो मैंने फिर से देखा और उस पैरामीटर को देखा जिसमें वह गुजर रहा था। – slugster

0

दरअसल 'एंडरसन Imes की प्रतिक्रिया, सही (वोट दें) है, हालांकि मैं दो टिप्पणी है:,

पहले अगर आप केवल एक वस्तु में से एक संपत्ति प्रदर्शित करने के लिए की जरूरत है, मुझे लगता है कि यह बजाय ListBox उपयोग में आसान और क्लीनर है ListView की, संपत्ति बंधन के लिए कोड को

<ListBox x:Name="lstPeople" DisplayMemberPath="Name" /> 

दूसरा कम हो जाएगा क्योंकि, यदि आप WPF का उपयोग कर रहे हैं और बाइंडिंग, सुनिश्चित करें कि आपके वस्तुओं को लागू INotifyPropertyChanged, ताकि परिवर्तन हमेशा यूआई और बीच सिंक्रनाइज़ कर रहे हैं वस्तुओं।

public class Person : INotifyPropertyChanged 
{ 
    int _id; 
    string _name; 

    public Person() 
    { } 

    public int ID 
    { 
     get { return _id; } 
     set { 
      _id = value; 
      RaisePropertyChanged("ID"); 
      } 
    } 

    public string Name 
    { 
     get { return _name; } 
     set { 
      _name = value; 
      RaisePropertyChanged("Name"); 
      } 
    } 

    pivate void RaisePropertyChanged(string propName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
    } 

} 
+0

टिप के लिए धन्यवाद; आगे बढ़ने से मुझे विश्वास होता है कि आप सही हैं और मुझे अपने कोड में शामिल IotifyProperty को लागू करना होगा। जानकारी के लिए धन्यवाद! – Randster

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