2010-01-25 24 views
5

मेरे पास कस्टम ऑब्जेक्ट्स की एक सूची है: दो स्ट्रिंग गुणों के साथ फल कहें नाम और रंग। ये एक सूची में हैं।WPF डेटाग्रिड समस्याओं की सूची के लिए बाध्यकारी

private readonly List<Fruit> fruitList = new List<Fruit>(); 

तब मैं सूची में फल वस्तुओं को लोड करता हूं।

मैं WPF डेटा ग्रिड के लिए इस सूची बाध्य करने के लिए कोशिश कर रहा हूँ:

सी #:

dgFruit.ItemsSource = "{Binding}"; 

XAML:

<toolkit:DataGrid Name="dgFruit" 
      ItemsSource="{Binding Path=fruitList}" > 
       <toolkit:DataGrid.Columns> 

        <toolkit:DataGridComboBoxColumn 
      Header="Name" 
      SelectedValueBinding="{Binding Path=Name}" 
      TextBinding="{Binding Path=Name}" Width="5*" /> 

        <toolkit:DataGridComboBoxColumn 
      Header="Color" 
      SelectedValueBinding="{Binding Path=Color}" 
      TextBinding="{Binding Path=Color}" Width="5*" /> 

       </toolkit:DataGrid.Columns> 
      </toolkit:DataGrid> 

कारण वे एक combobox में हो रहा है, क्योंकि मैं उपयोगकर्ता होना चाहता हूँ रिश्ते को बदलने में सक्षम यह वास्तविक उदाहरण नहीं है लेकिन आपको विचार मिलता है। उदाहरण के लिए कहें कि फल परिपक्व नहीं था इसलिए वे केला रंग को हरे रंग में बदलते हैं :)

मुझे डेटाग्रिड में इन वस्तुओं को प्राप्त करने में कोई भाग्य नहीं है ... और ट्रैक के नीचे, मुझे एक चाहिए datagridcell में आइटम पर क्लिक करें बता गया को बदल सकते हैं और फल के नाम और रंग के सभी संभव प्रकार दिखाने के लिए (ताकि वे रिश्तों को बदल सकते हैं)

यहाँ एक त्रुटि मैं हो रही है:

System.Windows.Data Error: 39 : BindingExpression path error: 'Color' property not found on 'object' ''Char' (HashCode=6750311)'. BindingExpression:Path=Color; DataItem='Char' (HashCode=6750311); target element is 'TextBlockComboBox' (Name=''); target property is 'Text' (type 'String') 

कर सकते हैं कोई मदद करता है? कारण मैं अपने कॉलम को xaml में सेट कर रहा हूं इसलिए मैं चौड़ाई को स्टार आकार में सेट कर सकता हूं और कॉलम बराबर चौड़ाई रख सकता हूं।

मुझे लगता है कि अधिकांश उदाहरण एक पर्यवेक्षण चयन का उपयोग करते हैं, लेकिन अगर मैं सूची में बाध्य कर सकता हूं तो मुझे इसका उपयोग क्यों करना है?

मुझे कृपया knwo मेरी उदाहरण आगे स्पष्टीकरण

संपादित करें की आवश्यकता है: क्या मैं अब है:

XAML:

  <toolkit:DataGrid Name="dgFruit" 
      ItemsSource="{Binding}" 
      AutoGenerateColumns="False"> 

       <toolkit:DataGrid.Columns> 
        <toolkit:DataGridTextColumn 
         Header="Name" 
         Width="5*"/> 

        <toolkit:DataGridComboBoxColumn 
      Header="Color" 
      Width="5*"/> 

        </toolkit:DataGrid.Columns> 
</toolkit:DataGrid> 

सी #:

DataContext = fruitList; 

असल में जब मैं DataContext का उपयोग करता हूं तो मुझे कोई इट नहीं मिलता है सुश्री। जब मैं आइटमसोर्स का उपयोग करता हूं तो मुझे रिक्त रेखाएं मिलती हैं, लेकिन पंक्तियों की सही संख्या इसलिए यह सही रेखाओं के साथ अधिक दिखाई देती है।

मैं डेटा दिखाने के लिए डेटा प्राप्त कर सकता हूं अगर मैं इसे स्वचालित रूप से कॉलम उत्पन्न करता हूं। अगर मैं autogeneratecolumns को गलत पर सेट करता हूं और फिर xaml में अपने कॉलम निर्दिष्ट करता हूं जैसे कि मैं स्टार साइजिंग का उपयोग करना चाहता हूं, मुझे कॉलम की सही संख्या मिलती है लेकिन कोई टेक्स्ट नहीं!

उत्तर

4

सबसे पहले है। यह लगभग निश्चित रूप से नहीं है जो आप चाहते हैं (वास्तव में, यदि आप ऐसा करते हैं तो आपको नौ पंक्तियों के साथ ग्रिड के साथ समाप्त होना चाहिए, स्ट्रिंग में प्रत्येक वर्ण के लिए एक!)। आप XAML, या कोड के पीछे आइटमसोर्स सेट कर सकते हैं, लेकिन आपको दोनों नहीं करना चाहिए। प्रयास करें निम्नलिखित:

<toolkit:DataGrid Name="dgFruit"  
        ItemsSource="{Binding}"> 
    ... 
</toolkit:DataGrid> 

और फिर अपने दृश्य के निर्माता में:

... 
    InitializeComponents(); 
    this.DataContext = fruitList; 
... 

अब के लिए डेटा संदर्भ अपने पूरे दृश्य सूची < फल >, और अपने ग्रिड के ItemsSource होने के लिए सेट कर दिया जाता है एक ही वस्तु मैं यहां मान रहा हूं कि फलसूची दृश्य का एक क्षेत्र है।

 <toolkit:DataGridTextColumn Header="Name" 
            Binding="{Binding Name}" 
            Width="5*" /> 
     <toolkit:DataGridComboBoxColumn Header="Color" 
             ItemsSource="{Binding Source={StaticResource AllColors}}" 
             SelectedValueBinding="{Binding Path=Color}" 
             TextBinding="{Binding Path=Color}" 
             Width="5*" /> 

कहाँ AllColors (इस मामले में) एक संसाधन के रूप में परिभाषित किया गया:

<x:Array x:Key="AllColors" 
     Type="sys:String"> 
    <sys:String>Orange</sys:String> 
    <sys:String>Yellow</sys:String> 
</x:Array> 

यह आरंभ करना चाहिए

अपने कॉलम के लिए बाइंडिंग कुछ ऐसा दिखाई देगा।

+0

यह owrks है, लेकिन जब मैं ऐसा करता हूं तो मैं xaml में परिभाषित कॉलम को अनदेखा कर देता हूं और यह बाईं ओर नए जोड़ता है। क्या मैं इन ऑटो जनरेट किए गए कॉलम के लिए प्रोग्रामिक रूप से स्टार आकार सेट कर सकता हूं? – baron

+0

आप स्वतः जेनरेट किए गए लोगों को बंद कर सकते हैं। XAML में आपके डेटाग्रिड पर: ऑटोजनेर कॉलम = "झूठा" – lesscode

+0

करीब आ रहा है, हालांकि कोई आइटम नहीं दिख रहा है :(हालिया संपादन देखें – baron

4

डब्ल्यूपीएफ फ़ील्ड को बाध्यकारी का समर्थन नहीं करता है। ऐसी संपत्ति बनाएं जो fruitList तक पहुंचें और उस पर बाध्य करें।

// this is the field. you can't bind to this 
    private readonly List<Fruit> fruitList = new List<Fruit>(); 

    // this is the property. you can bind to this 
    public List<Fruit> FruitList 
    { 
     get { return fruitList; } 
    } 

उपयोग dgFruit.DataContext = this; बजाय dgFruit.ItemsSource = "{Binding}";

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

public class Fruit 
{ 
    public string Name { get; set; } 
    public string Color { get; set; } // bind the combobox selectedvalue to this 

    public List<string> AvailableColors { get; set; } // bind the combobox ItemsSource to this 
} 

लग सकता है और अगर आप की तरह आप एक List उपयोग कर सकते हैं।

dgFruit.ItemsSource = "{Binding}" 

एक स्ट्रिंग शब्द ब्रेसिज़ में बाइंडिंग युक्त करने के लिए आइटम स्रोत स्थापित करना चाहिए: ObservableCollection का लाभ यह, यह पहले से ही INotifyCollectionChanged और INotifyPropertyChanged लागू करता है के लिए आप

+0

मुझे समझ में नहीं आता कि फ्रेडलिस्ट तक पहुंचने वाली संपत्ति बनाने से आपका क्या मतलब है। मुझे लगता है कि मैं पर्यवेक्षण चयन का उपयोग कर सकता हूं कि मैं हर जगह सूचियों का उपयोग करता हूं। और मुझे लगता है कि इसे एक सूची होने की आवश्यकता है। मैं चाहता हूं कि वह सूची फल में सभी मूल्य हो। रंग या फल। नाम। ग्रिडव्यू शूल्ड मूल संबंध दिखाता है, यानी ऐप्पल -> लाल और केला -> पीला मूल्य हैं, लेकिन यदि मैं ऐप्पल पर डबल क्लिक करता हूं तो मैं फल वस्तुओं के सभी विकल्पों के साथ कॉम्बो देखता हूं, इसलिए ऐप्पल और केला, और इसी तरह रंग के साथ .. – baron

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