2010-02-22 70 views
9

我綁定一個DataGrid通過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定義任何列(下面是它是如何在科林完成埃伯哈特的帖子

<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

該轉換器通過屬性路徑獲得的數據後調用。由於Row中沒有「Forename」屬性,它不起作用(您可以在Output窗口中看到Binding異常)。

我解決它通過更改綁定定義:

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

,你不能有兩路沒有路(我沒有第二行有例外)結合。 沒有屬性路徑是有道理的,因爲我們想綁定到完整的Row對象,而不是其屬性之一。

注意:使用VS 2008 SP1,WPF項目進行測試。

+0

啊,偉大的工作,謝謝。 – 2010-02-25 19:14:06