2011-04-27 13 views
10

में डाटाग्रिड बाध्यकारी मुझे पता है कि यह पहले से ही पूछा गया है लेकिन मैंने डेवलपर्स द्वारा सुझाए गए लगभग हर चीज को किया है।डब्ल्यूपीएफ

<DataGrid x:Name="Imported" VerticalAlignment="Top" DataContext="{Binding Source=list}" AutoGenerateColumns="False" CanUserResizeColumns="True"> 
    <DataGrid.Columns>     
     <DataGridTextColumn Header="ID" Binding="{Binding Path=ID}"/> 
     <DataGridTextColumn Header="Date" Binding="{Binding Path=Date}"/> 
    </DataGrid.Columns> 
</DataGrid> 

मैं इसे मॉडल संवाद बॉक्स में दिखाने और मोडल संवाद बॉक्स के निर्माता में लाइसेंस सूची को पॉप्युलेट करने का प्रयास कर रहा हूं। लेकिन अभी भी डेटाग्रिड के अंदर कुछ भी नहीं आ रहा है।

निर्माता कोड:

public diagboxclass() 
{ 
    List<object> list = new List<object>(); 
    list = GetObjectList(); 
} 

public class object 
{ 
    string id; 
    DateTime date; 
    public string ID 
    { 
     get { return id; } 
     set { id = value; } 
    } 
    public DateTime Date 
    { 
     get { return date; } 
     set { date = value; } 
    } 
} 

तुम लोगों वस्तु सूची के साथ कुछ लगता है?

+0

मेरी सूची ऑब्जेक्ट में ऊपर दिए गए दो की तुलना में अधिक अन्य गुण हैं जो बाध्यकारी नहीं है? क्या इससे कोई अंतर हो सकता है? – alice7

+0

शायद नहीं। कृपया अपने कुछ एक्सएएमएल साझा करें (जिसमें 'सूची' परिभाषित किया गया है) ताकि हम आगे की मदद कर सकें। –

+0

मैंने शीर्ष पर कोड जोड़ा है। – alice7

उत्तर

18

ऑब्जेक्ट सूची को देखे बिना, मुझे विश्वास है कि आपको डेटाग्रिड की ItemsSource संपत्ति पर बाध्यकारी होना चाहिए, न कि DataContext

<DataGrid x:Name="Imported" VerticalAlignment="Top" ItemsSource="{Binding Source=list}" AutoGenerateColumns="False" CanUserResizeColumns="True"> 
    <DataGrid.Columns>     
     <DataGridTextColumn Header="ID" Binding="{Binding ID}"/> 
     <DataGridTextColumn Header="Date" Binding="{Binding Date}"/> 
    </DataGrid.Columns> 
</DataGrid> 

(मतलब यह है कि तत्व [UserControl, आदि] में शामिल है कि डेटा ग्रिड अपने DataContext एक वस्तु है कि list संग्रह होता करने के लिए बाध्य है। डेटा ग्रिड ItemsControl से प्राप्त होता है, जो अपने ItemsSource पर निर्भर करता है संपत्ति, संग्रह यह करने के लिए अपनी पंक्तियों बांधता है। इसलिए परिभाषित करने के लिए करता है, तो list एक वस्तु अपने नियंत्रण के DataContext करने के लिए बाध्य की संपत्ति, आप दोनों DataContext={Binding list} और ItemsSource={Binding list} डेटा ग्रिड पर स्थापित करने के लिए आवश्यकता हो सकती है ...)

+0

यह आइटमसोर्स के साथ भी काम नहीं करता है। मैंने कोशिश की है। – alice7

+0

@ alice7 फिर कृपया कुछ एक्सएएमएल पोस्ट करें जो आपकी बाकी विंडो/उपयोगकर्ता नियंत्रण/जो भी ग्रिड है, दिखा रहा है, और हमें बताएं कि 'सूची' कैसे परिभाषित की गई है। :) –

+0

मैंने पूरी सामग्री को हटा दिया है और बस डेटाग्रिड छोड़ दिया है। इसलिए कोई अन्य नियंत्रण नहीं है। यहां कोड isnide कन्स्ट्रक्टर है: सूची ऑब्जेक्टलिस्ट = नई सूची (); objectList = GetObjectList(); – alice7

25

नहीं है कृपया ऑब्जेक्ट का उपयोग न करें एक वर्ग का नाम:

public class MyObject //better to choose a appropriate name 
{ 
    string id; 
    DateTime date; 
    public string ID 
    { 
     get { return id; } 
     set { id = value; } 
    } 
    public DateTime Date 
    { 
     get { return date; } 
     set { date = value; } 
    } 
} 

आप इस वर्ग के लिए और निश्चित रूप की INotifyPropertyChanged को लागू करना चाहिए यह संपत्ति सेटर पर कॉल करें। अन्यथा आपके यूई में परिवर्तन दिखाई नहीं देता है।

आपका व्यूमोडेल क्लास/डायलॉगबॉक्स क्लास में MyObject सूची मेंProperty होना चाहिए। ObservableCollection<MyObject> जाने का रास्ता है:

public ObservableCollection<MyObject> MyList 
{ 
    get... 
    set... 
} 

में अपने xaml आप MyObject के अपने संग्रह में Itemssource स्थापित करना चाहिए। इसके अलावा अपने सूची को प्रभावी ढंग से से भर जाता है और के रूप में Blindmeis से उल्लेख किया है, शब्दों का प्रयोग कभी नहीं सुनिश्चित हो (Datacontext अपने dialogbox वर्ग रहना होगा!) के पीछे कोड

public diagboxclass() 
    { 
     List<object> list = new List<object>(); 
     list = GetObjectList(); 
     Imported.ItemsSource = null; 
     Imported.ItemsSource = list; 
    } 

में यह करने के लिए

<DataGrid ItemsSource="{Binding Source=MyList}" AutoGenerateColumns="False"> 
    <DataGrid.Columns>     
    <DataGridTextColumn Header="ID" Binding="{Binding ID}"/> 
    <DataGridTextColumn Header="Date" Binding="{Binding Date}"/> 
    </DataGrid.Columns> 
</DataGrid> 
+0

मेरे मामले में डेटाग्रिड का आइटमसोर्स होना चाहिए: आइटमसोर्स = "{बाइंडिंग माईलिस्ट}" – RHAD

3

कोशिश कि पहले ही सी # में एक समारोह दिया गया है।