2009-11-16 99 views
2

我正在努力學習WPF數據綁定的曲線,並可以使用一個例子。獎勵積分,回答問題並鏈接到幫助他們「獲得」WPF數據綁定的文章。將WPF DataGrid ItemsSource綁定到方法,IEnumerable <TableRow> GetRows(),自定義Table對象?

我想綁定自定義Table對象與WPF DataGrid。

這裏是我的對象(我沒有改變他們的能力,簽名截斷了一下):

public class MyTable 
{ 
    public int ColumnCount { get; } 
    public string GetColumnName(int columnIndex); 
    public IEnumerable<MyTableRow> GetRows(); 
} 

public class MyTableRow 
{ 
    public MyTableCell [] Cells { get; } 
} 

public class MyTableCell 
{ 
    public string Value { get; } 
} 

因此,對當前的WindowDataContextMyTable一個實例。我看不出自動任何明確的方式從我MyTable對象生成欄目,所以我的代碼生成它們:

private void dg_Table_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) 
{ 
    MyTable tbl = e.NewValue as MyTable; 

    if (tbl != null) 
    { 
     //setup data grid columns 
     dg_Table.Columns.Clear(); 

     for (int i = 0; i < tbl.ColumnCount; i++) 
     { 
      var column = new DataGridTextColumn() 
      { 
       Header = tbl.GetColumnName(i), 
       Binding = new Binding(string.Format("Cells[{0}]", i)) 
      }; 

      dg_Table.Columns.Add(column); 
     } 
     //end setup data grid columns 
    } 
} 

我認爲,下一步將是對DataGridItemsSource屬性綁定到GetRows方法MyTable對象,但我不知道如何做到這一點。我想也許這可以使用ObjectDataProvider資源完成,但我無法弄清楚如何在DataContext對象上引用方法。

有人可以幫我用這個場景的XAML和代碼嗎?

回答

3

AFAIK你不能綁定到特定實例的方法。您可以綁定到一個屬性,或一個在XAML中創建的實例的方法,或一個靜態方法,但不是給定實例的方法。

請參閱Bind to a method in WPF

這是一些幫助我的綁定鏈接。

編輯:我意識到我應該嘗試過於解決當前的問題。 :P

首先,我沒有太多關於WPF中的DataGrid控件的經驗。話雖如此,不是它綁定ItemsSource時自動生成列?

我將處理您的問題的方式是創建一個圍繞MyTable對象的包裝器,並在包裝​​器中實現調用GetRows方法的屬性。將DataContext設置爲包裝並將ItemsSource綁定到屬性。

+0

奇怪的是,您無法綁定到未通過XAML創建的對象上方法的返回值。 – 2009-11-16 05:29:57

2

使用值轉換器來索引單元格數組非常簡單。到轉換器的參數是指數:

... 
    var column = new DataGridTextColumn() 
    { 
     Header = tbl.GetColumnName(i), 
     Binding = new Binding 
     { 
     Converter = CellAccessConverter.Instance, 
     Parameter = i 
     } 
    } 
    ... 

這裏是轉換器本身:

private class CellAccessConverter : IValueConverter 
    { 
    public static readonly Instance = new CellAccessConverter(); 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return ((MyTableRow)value).Cells[(int)parameter]; 
    } 
    object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
    } 

享受!

相關問題