2011-06-26 28 views
0

我需要創建綁定到一個對象,它是類似於下面的一個DataGrid:創建數據表內的的IValueConverter類的DataGrid綁定

public class MyClass 
{ 
    public string Header { get; set; } 
    public string[] Values { get; set; } 
} 

正如你所看到的,所需要的表頭不是對象的屬性名稱,所以我不能只使用AutoGenerateColumns。到目前爲止,我的想法是使用轉換器獲取MyClass對象並將它們轉換爲DataTable。

public object Convert(
    object value, 
    Type targetType, 
    object parameter, 
    System.Globalization.CultureInfo culture) 
{ 
    var items = value as IEnumerable<MyClass>; 
    if (items != null) 
    { 
     DataTable dTable = new DataTable(); 
     foreach (MyClass item in items) 
      dTable.Columns.Add(new DataColumn(item.Header, typeof(string))); 

     return dTable; 
    } 
    else 
     return null; 
} 

我設置包含網格的DataContext的是一個List<MyClass>對象和轉換()方法被擊中,數據表是由事物的外觀創建好了,但是當我來運行應用程序時, DataGrid只是空白。這裏是我的XAML的基本視圖:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:WpfApplication1" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <local:DataTableConverter x:Key="converter"/> 
    </Window.Resources> 

    <Grid x:Name="grid"> 
     <DataGrid AutoGenerateColumns="True" 
        ItemsSource="{Binding Path=., Converter={StaticResource converter}}"/> 
    </Grid> 
</Window> 

任何想法爲什麼DataGrid保持爲空?

回答

0

當然它是空白的,你創建一個DataTable沒有任何行。

如果我正確理解你的(有點奇怪的)設計,則每個MyClass代表一列及其所有值。要顯示,你必須填寫行DataTable與您的類的值:

public object Convert(
    object value, Type targetType, object parameter, CultureInfo culture) 
{ 
    var items = value as IEnumerable<MyClass>; 
    if (items != null) 
    { 
     var array = items.ToArray(); 
     var dTable = new DataTable(); 
     foreach (MyClass item in array) 
      dTable.Columns.Add(new DataColumn(item.Header, typeof(string))); 

     if (array.Length > 0) 
      for (int i = 0; i < array[0].Values.Length; i++) 
       dTable.Rows.Add(array.Select(mc => mc.Values[i]).ToArray()); 

     return dTable; 
    } 
    return null; 
} 
+0

什麼是更好的方法來設計呢? –

+0

@Tom,我不知道你爲什麼這樣做,所以這可能是最好的選擇。但是一般來說,你應該有一些具體類型的對象集合,每個對象代表一行。 – svick

+0

我遇到的問題是,對象可能表示n列 - 可能是1,可能是100 - 每個只有一個或零值(實質上是一個帶有文本框事件的標籤)。該解決方案感覺不正確...但現在是解決方案:) –