2010-02-22 10 views
9

मैं बाइंडिंग हूँ में एक डेटा ग्रिड गतिशील डेटा को IDictionary के माध्यम से जोड़ने के लिए: http://www.scottlogic.co.uk/blog/colin/2009/04/binding-a-silverlight-datagrid-to-dynamic-data-via-idictionary/comment-page-1/#comment-8681कैसे गतिशील रूप से एक कनवर्टर कोड-पीछे

लेकिन मैं XAML में किसी भी स्तंभ को परिभाषित नहीं करना चाहते (नीचे यह कैसे कॉलिन में किया जाता है है Eberhardt पद

<data:DataGrid.Columns> 
    <data:DataGridTextColumn Header="Forename" Binding="{Binding Converter={StaticResource RowIndexConverter}, ConverterParameter=Forename}" /> 
</data:DataGrid.Columns> 

तो मैं कोशिश करते हैं और पीछे कोड में एक ही बात करने के लिए निम्नलिखित कोड लिखा है, लेकिन कोड RowIndexConverter फोन नहीं करता है कुछ कमी किया जाना चाहिए

कोड:।।

कोड (यहां संदर्भ के लिए) की
// add columns 

DataGridTextColumn textColumn = new DataGridTextColumn(); 
textColumn.Header = "Forename"; 

Binding bind = new Binding("Forename"); 
bind.Converter = new RowIndexConverter() ; 
bind.ConverterParameter = "Forename";    

textColumn.Binding = bind; 
_dataGrid.Columns.Add(textColumn); 

बाकी:

// generate some dummy data 
Random rand = new Random(); 
for (int i = 0; i < 200; i++) 
{ 
    Row row = new Row(); 
    row["Forename"] = s_names[rand.Next(s_names.Length)]; 
    row["Surname"] = s_surnames[rand.Next(s_surnames.Length)]; 
    row["Age"] = rand.Next(40) + 10; 
    row["Shoesize"] = rand.Next(10) + 5; 

    _rows.Add(row); 
} 

// bind to our DataGrid 
_dataGrid.ItemsSource = _rows;  

public class Row 
{ 
    private Dictionary<string, object> _data = new Dictionary<string, object>(); 

    public object this[string index] 
    { 
     get 
     { 
      return _data[index]; 
     } 
     set 
     { 
      _data[index] = value; 
     } 
    } 
} 

उत्तर

8

कनवर्टर संपत्ति पथ के माध्यम से डेटा पर प्राप्त करने के बाद कहा जाता है। चूंकि पंक्ति में कोई "Forename" प्रॉपर्टी नहीं है, यह काम नहीं करती है (आप आउटपुट विंडो में बाध्यकारी अपवाद देख सकते हैं)।

मैं करने के लिए बाध्यकारी परिभाषा बदलकर इसे हल:

Binding bind = new Binding(); 
    bind.Mode = BindingMode.OneWay; 

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

नोट: वीएस 2008 एसपी 1, डब्ल्यूपीएफ परियोजना के साथ परीक्षण किया गया।

+0

आह, महान काम, धन्यवाद। –

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