2011-03-28 15 views
5

मेरे पास मेरे डब्ल्यूपीएफ एप्लिकेशन में डाटाग्रिड नियंत्रण है और मैं अपने मुख्य विंडो की कक्षा में एक अवलोकन योग्य चयन संपत्ति पर उस नियंत्रण को बांधने की कोशिश कर रहा हूं। संपत्ति मैं करने के लिए बाध्य करने के लिए कोशिश कर रहा हूँ के रूप में परिभाषित किया गया है:डब्ल्यूपीएफ आइटमसोर्स बाइंडिंग

private ObservableCollection<RequestResult> m_SentRequests = new ObservableCollection<RequestResult>(); 
public ObservableCollection<RequestResult> SentRequests { get { return m_SentRequests; } } 

मेरे datagrid एक समूह में है जिसके द्वारा DataContext MainWindow करने के लिए सेट है:

<GroupBox Header="Results" Height="275" HorizontalAlignment="Stretch" Margin="0,305,0,0" Name="grpResults" VerticalAlignment="Top" Width="712" DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=my:MainWindow, AncestorLevel=1}}"> 
    <Grid> 
     <DataGrid AutoGenerateColumns="False" Height="246" HorizontalAlignment="Stretch" Margin="6,6,6,0" Name="dgResults" VerticalAlignment="Top" ItemsSource="{Binding Path=SentRequests}" DataContext="{Binding}" IsSynchronizedWithCurrentItem="True" /> 
    </Grid> 
</GroupBox> 

समस्या यह है कि मैं आ रही हैं यह है कि गुण विंडो में, जब मैं अपने आइटम्स स्रोत के रूप में SentRequests का चयन करता हूं, तब भी मैं "संपत्ति-बाउंड कॉलम संपादित करें" विकल्प का चयन नहीं कर सकता। मुझे यह क्रिया करने से पहले "आपको आइटमसोर्स सेट करना होगा" संवाद प्राप्त करें। "कॉलम जेनरेट करें" और "कॉलम निकालें" चुनते समय मुझे वही त्रुटि मिलती है। ऐसा लगता है कि मैंने अपने संवाद के लिए आइटम्ससोर्स प्रॉपर्टी में कुछ भी सेट नहीं किया है।

मैं ऑटोजनेर कॉलम को सत्य में सेट कर सकता हूं हालांकि मुझे लगता है कि मेरा डेटा बाध्य हो गया है (हालांकि, कॉलम के साथ मैं नहीं दिखाना चाहता हूं)।

मैं WPF के लिए बहुत नया हूं और मैं इसे विंडोज सेवा का परीक्षण करने के लिए एक त्वरित परीक्षण ऐप के रूप में लिख रहा हूं।

कोई भी जानता है कि मैं यहां क्या गलत कर रहा हूं?

+0

डेटाग्रिड में डेटाकॉन्टेक्स्ट = "{बाइंडिंग}" मैं अनावश्यक हूं, क्योंकि सामान्य डेटाकॉन्टेक्स्ट में विरासत प्राप्त हो रही है। –

+0

@ एचबी। धन्यवाद, मैंने इसे साफ कर लिया। इससे कोई फर्क नहीं पड़ता (ऐसा नहीं कि आपने इसे उम्मीद की थी)। शायद मेरे द्वारा कई चीजों की कोशिश कर एक कलाकृति। – Redbaran

उत्तर

1

क्या आपने डेटाकॉन्टेक्स्ट टैग के बिना प्रयास किया है? ग्रुपबॉक्स और डाटाग्रिड दोनों में।

संपादित

कुछ इस तरह:

<GroupBox Header="Results" Height="275" HorizontalAlignment="Stretch" > 
    <Grid> 
     <DataGrid AutoGenerateColumns="False" Height="246" HorizontalAlignment="Stretch" Name="dgResults" VerticalAlignment="Top" ItemsSource="{Binding Path=SentRequests}" IsSynchronizedWithCurrentItem="True" /> 
    </Grid> 
</GroupBox> 
+0

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

+0

डैनियल, यह काम नहीं करता है। एक डाटाकॉन्टेक्स्ट सेट के बिना, मेरी संपत्ति पर प्राप्त करने के लिए अब और नहीं कहा जाता है, और न ही यह मुझे कॉलम संपादित करने के लिए प्रॉपर्टी विंडो का उपयोग करने की अनुमति देता है। – Redbaran

2

यह शायद प्रवंचना में से कुछ का एक परिणाम है कि डिजाइनर लगातार (कोड-पीछे कंस्ट्रक्टर्स लंघन की तरह) संकलन के बिना रेंडर करने के लिए करता है। अपने संग्रह को एक अलग वर्ग में ले जाने का प्रयास करें और इसके डेटा कॉन्टेक्स्ट (जैसे एमवीवीएम व्यूमोडेल) के उदाहरण का उपयोग करें। अन्य वर्ग सामान्य रूप से प्रारंभ करने और डिजाइनर को बाध्य संपत्ति प्रदान करने में सक्षम होना चाहिए।

3

मुझे विश्वास नहीं है कि आपको अपने आइटम स्रोत के भीतर पथ पैरामीटर की आवश्यकता है। तुम बस ItemsSource = {बाइंडिंग SentRequests} के रूप में बाध्यकारी सेट करने के लिए सक्षम होना चाहिए

तुम भी अगर मैं एक डमी संग्रह बनाने के उदाहरण के लिए कोड में ग्रिड आइटम स्रोत करने के लिए बाध्य कर सकते हैं:

public class People 
{ 

    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Age { get; set; } 
    public string address { get; set; } 
    public string zip { get; set; } 
} 

और फिर पॉप्युलेट यह

this.AllPeople = new ObservableCollection<People>(); 


     private void FillData() 
    { 
     People p1 = new People(); 
     p1.FirstName = "John"; 
     p1.LastName = "Doe"; 
     p1.Age = "24"; 
     p1.address = "123 Main Street"; 
     p1.zip = "11111"; 

     People p2 = new People(); 
     p2.FirstName = "Jane"; 
     p2.LastName = "Smith"; 
     p2.Age = "36"; 
     p2.address = "456 Water Street"; 
     p2.zip = "22222"; 

     People p3 = new People(); 
     p3.FirstName = "Larry"; 
     p3.LastName = "Williams"; 
     p3.Age = "24"; 
     p3.address = "785 Water Street"; 
     p3.zip = "33333"; 

     this.AllPeople.Add(p1); 
     this.AllPeople.Add(p2); 
     this.AllPeople.Add(p3); 
    } 

मैं तो mainpage contsructor या के रूप में विधि में आइटम स्रोत सेट कर सकते हैं:

this.gridviewname.ItemsSource = "AllPeople";

+0

क्या यह डिजाइनर में भी काम करता है? –

+0

क्या आप डिज़ाइनर द्वारा अपना मतलब बता सकते हैं?क्या आप बाध्यकारी का जिक्र कर रहे हैं? यदि ऐसा है तो हाँ आइटम स्रोत को संग्रह में सेट करें और आपको जाने के लिए अच्छा होना चाहिए। – rlcrews

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