2011-03-21 9 views
5

ठीक है, मैं प्रोग्रामिंग या सी # में कोई नौसिखिया नहीं हूं, मुझे लगता है कि मुझे सीधे मेरे सिर में डब्ल्यूपीएफ का डाटाबेसिंग नहीं मिल रहा है। मेरे सहयोगी इसके बारे में चिल्ला रहे हैं (और हाँ, मैं उन्हें भी पूछूंगा) लेकिन अभी मैं स्टंप हो गया हूं।मेरे सिर में WPF डेटा बाइंडिंग प्राप्त नहीं हो रहा है

यहाँ मैं शुरुआत के लिए क्या करना चाहते हैं क्या:

एक उदाहरण के रूप मैं बातें इस तरह की एक सूची मिल गया है:

List<Thing> thingList = Source.getList(); 

अब सामान्य रूप से मैं

जाना चाहते हैं
foreach(Thing t in thingList) 
{ 
    //add thing to combobox 
} 

लेकिन जो मैं इकट्ठा कर सकता हूं वह है कि मैं किसी भी तरह ऐसा नहीं कर सकता लेकिन सी को पॉप्युलेट करने के लिए डेटाबेस का उपयोग कर सकता हूं मेरे लिए ombobox।

मुझे जो प्रतीत नहीं होता है वह है जहां क्या मैं 'चीज़लिस्ट' डालता हूं? क्या मैं इसे कहीं अलग संपत्ति बना सकता हूं? मैं उस संपत्ति को कहां रखूं?

मुझे इस समय बहुत बेवकूफ लगता है, क्योंकि मैं थोड़ी देर के लिए इसके साथ संघर्ष कर रहा हूं और मुझे वहां कोई उदाहरण नहीं मिल रहा है जो मुझे यह समझने में सक्षम बनाता है - शायद बहुत सरल - अवधारणा।

कोई भी मेरी मदद करने के लिए तैयार है या मुझे कुछ कदम-दर-चरण मार्गदर्शिका पर इंगित करता है, तो शायद मुझे याद आए?

+0

यह Winforms Databinding ऐसा कुछ है, तो आपके कॉम्बो बॉक्स एक 'DataSource' संपत्ति (या कुछ इसी तरह) होनी चाहिए, और आप' comboBox.DataSource = Source.getList() सेट करने में सक्षम होना चाहिए, 'के रूप में जब तक आप 'DisplayMember' और 'ValueMembers' सेट करते हैं, तो सही चीज़ प्रदर्शित होगी, और चयनित वैल्यू ऑब्जेक्ट को पुनर्प्राप्त करेगा। – Crisfole

+0

यहां कुछ ऐसे प्रश्न हैं जो आपको सही दिशा में शुरू कर देंगे: [एक कस्टम सूची में बाध्यकारी WPF कॉम्बोबॉक्स] (http://stackoverflow.com/questions/561166/binding-wpf-combobox-to-a- कस्टम-सूची) और [एमवीवीएम: ट्यूटोरियल से शुरू करने के लिए ट्यूटोरियल] (http://stackoverflow.com/questions/1405739/mvvm-tutorial-from-start-to-finish) –

+0

डब्ल्यूपीएफ में, कॉम्बोबॉक्स और लिस्ट व्यू जैसी चीजें उपयोग की जाती हैं डेटा के लिए दृश्य कंटेनर के रूप में। कोड के पीछे, या फ़ाइल से इत्यादि में अपनी सूचियां बनाएं और संपादित करें और फॉर्म पर नियंत्रण से जुड़ें। – coldandtired

उत्तर

2

WPF में डेटाबेसिंग के लिए ObservableCollection<T> का उपयोग करें। टी आपकी कक्षा कहां है।

public class NameList : ObservableCollection<PersonName> 
{ 
    public NameList() : base() 
    { 
     Add(new PersonName("A", "E")); 
     Add(new PersonName("B", "F")); 
     Add(new PersonName("C", "G")); 
     Add(new PersonName("D", "H")); 
    } 
    } 

    public class PersonName 
    { 
     private string firstName; 
     private string lastName; 

     public PersonName(string first, string last) 
     { 
      this.firstName = first; 
      this.lastName = last; 
     } 

     public string FirstName 
     { 
      get { return firstName; } 
      set { firstName = value; } 
     } 

     public string LastName 
     { 
      get { return lastName; } 
      set { lastName = value; } 
     } 
    } 

अब XAML में उदाहरण देखें। संसाधन टैग

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 

    xmlns:c="clr-namespace:SDKSample" 

    x:Class="Sample.Window1" 
    Width="400" 
    Height="280" 
    Title="MultiBinding Sample"> 

    <Window.Resources> 
    <c:NameList x:Key="NameListData"/> 
    </Window.Resources> 


<ListBox Width="200" 
     ItemsSource="{Binding Source={StaticResource NameListData}}" // Name list data is declared in resource 
     ItemTemplate="{StaticResource NameItemTemplate}" 
     IsSynchronizedWithCurrentItem="True"/> 

xmnls:c आपको कक्षा चुनने का विकल्प देगा। यहां आप सी, डी, ई एक्स चुन सकते हैं, लेकिन यह सुनिश्चित कर लें कि इसे पहले इस्तेमाल किया जाना चाहिए

+1

संग्रह को बदलने की अपेक्षा होने पर आपको केवल 'ObservableCollection' का उपयोग करने की आवश्यकता है। यदि संग्रह स्थैतिक है, तो 'IENumerable' लागू करने वाली कोई भी चीज़ ठीक होगी। –

+0

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

+0

यह वही है जो मैं ढूंढ रहा था, हां। मुझे पता है कि यह एक बहुत व्यापक विषय है, लेकिन जो आप वर्णन करते हैं वह ज्यादातर 'स्वचालित' प्रक्रिया की तरह है जो मैं सोच रहा था। धन्यवाद। –

2

जब डेटा-बाध्यकारी की बात आती है तो मुझे पता चला है कि this page अगर पढ़ा जाता है तो अधिकांश प्रश्नों के बारे में पूरी तरह उत्तर देते हैं।

प्रश्न का उत्तर देने के लिए: सभी वस्तुओं को जोड़ने के लिए अलौकिक है कॉम्बोबॉक्स को कहां से प्राप्त करना है, यह ItemsSource संपत्ति के साथ किया जाता है।

आप या तो जब तुम XAML में एक बाध्यकारी अभिव्यक्ति की आवश्यकता होगी एक सामान्य काम कोड में क्या करना चाहिए XAML में या कोड में इस सेट कर सकते हैं,:

comboBox.ItemsSource = thingList; 

आप आगे कैसे में उन वस्तुओं निर्दिष्ट नहीं करते हैं सूची को प्रदर्शित किया जाना है ToString विधि को कॉल किया जाएगा, जब तक कि ओवरराइड नहीं किया जाता है, आप आमतौर पर अपने ऑब्जेक्ट के क्लास-पथ के साथ समाप्त हो जाते हैं।

मुट्ठी और अधिक भारी विकल्प, दूसरी Data Templates जो नियंत्रण का उपयोग (बदले में वस्तुओं और टेम्पलेट्स आदि हो सकता है) जटिल डेटा प्रदर्शित करने के लिए प्रयोग किया जाता है: वहाँ कैसे आवेदन कह के दो मुख्य तरीके वस्तु प्रदर्शित करने के लिए कर रहे हैं रास्ता DisplayMemberPath जैसे हल्के गुणों का उपयोग कर रहा है, जिसे संपत्ति के नाम पर सेट किया जाना चाहिए जिसे आमतौर पर प्रदर्शित किया जाना चाहिए (आमतौर पर केवल एक स्ट्रिंग)।

यदि आपकी सूची बदलती है और कॉम्बो बॉक्स को अपने आप अपडेट किया जाना चाहिए तो स्रोत को INotifyCollectionChanged लागू करना चाहिए, ज्यादातर मामलों में आप मानक कार्यान्वयन ObersableCollection<T> का उपयोग करेंगे।

1

अधिकांश लोग कम्बोबॉक्स को पॉप्युलेट करने के लिए डब्ल्यूपीएफ डाटाबेसिंग का उपयोग करेंगे लेकिन आपको यह नहीं करना है।

यदि आप चाहें तो कोड के जरिए आइटम जोड़ सकते हैं।

सबकुछ करने में फंस जाना आसान है क्योंकि इसे "ऐसा करना" बिना किसी कारण के किया जाना चाहिए (बीटीडब्लू, मैं आपको मैन्युअल रूप से आइटम जोड़ने की सिफारिश नहीं कर रहा हूं, मैं बस इतना कह रहा हूं कि आप कर सकते हैं)।

List<Thing> thingList = Source.getList(); 

foreach(Thing t in thingList) 
{ 
    combobox.Items.Add(t); 
} 
+0

यह संभवतः इसे पूरा करने का सबसे खराब तरीका है और इस तरह से ऐसा करने के कई अच्छे कारण नहीं हैं। कम से कम आपको प्रत्येक आइटम को अलग-अलग जोड़ने के बजाय आइटम्ससोर्स को संग्रह असाइन करने के लिए अपना उदाहरण अपडेट करना चाहिए। –

+0

मैंने सोचा कि मैंने यह स्पष्ट कर दिया है कि मैं सूची को पॉप्युलेट करने के इस तरीके की सिफारिश नहीं कर रहा था। मैं सिर्फ कथन का जवाब दे रहा था "लेकिन जो मैं इकट्ठा कर सकता हूं वह यह है कि मैं ऐसा नहीं कर सकता"। – grantnz

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