2016-01-17 58 views
0

我的XAML看起來是這樣的:編程方式創建WPF DataGrid列未綁定

<DataGrid Name="gridBasket" AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding BasketName}"> 
     </DataGridTextColumn> 
    </DataGrid.Columns> 
</DataGrid> 

而且我的課是這樣的:

public class Fruit 
{ 
    public int FruitId { get; set; } 
    public string FruitName { get; set; } 
    public int FruitCount { get; set; } 
} 

public class Basket 
{ 
    public int BasketId { get; set; } 
    public string BasketName { get; set; } 
    public ObservableCollection<Fruit> Fruits { get; set; } 
} 

public class Shop 
{ 
    public static ObservableCollection<Basket> Bind() 
    { 
     return new ObservableCollection<Basket> 
     { 
      new Basket { BasketId = 1, BasketName = "Gold", 
       Fruits = new ObservableCollection<Fruit> 
       { 
        new Fruit { FruitId = 1, FruitName = "Oranges", FruitCount = 10 }, 
        new Fruit { FruitId = 2, FruitName = "Apples", FruitCount = 8 }, 
        new Fruit { FruitId = 3, FruitName = "Bananas", FruitCount = 6 } 
       } 
      }, 
      new Basket { BasketId = 2, BasketName = "Silver", 
       Fruits = new ObservableCollection<Fruit> 
       { 
        new Fruit { FruitId = 1, FruitName = "Oranges", FruitCount = 5 }, 
        new Fruit { FruitId = 2, FruitName = "Apples", FruitCount = 4 }, 
        new Fruit { FruitId = 3, FruitName = "Bananas", FruitCount = 3 } 
       } 
      } 
     }; 
    } 
} 

在我後面的代碼我試圖動態地添加列並設置這些動態列綁定到嵌套的集合屬性。

private void LoadData() 
{ 
    gridBasket.AutoGenerateColumns = false; 

    ObservableCollection<DemoBEL.Basket> bColl = DemoBEL.Shop.Bind(); 
    gridBasket.ItemsSource = bColl; 

    int i = 0; 
    foreach (DemoBEL.Fruit fObj in bColl[0].Fruits) 
    { 
     gridBasket.Columns.Add(AddColumn(i, fObj.FruitName)); 
     i++; 
    } 
} 

private DataGridTextColumn AddColumn(int i, string propName) 
{ 
    DataGridTextColumn tc = new DataGridTextColumn(); 
    tc.Header = propName; 
    String binding = String.Format("{{Binding Path=Fruits[{0}].{1}}}", 0, "FruitCount"); 
    Binding tcBinding = new Binding(binding); 
    tc.Binding = tcBinding; 
    return tc; 
} 

計數即將變空。但是,如果我把固定值相同的綁定,計數開始出現。我應該做些什麼改變,以便每個水果的數量開始出現在標題中指定水果下的數據網格中。

Cells are blank

+0

爲什麼你不希望使用綁定?動態創建的列和數據綁定不是相互排斥的概念。 –

+0

@MarkFeldman只要我從所提供的課程獲得期望的輸出,我就願意使用任何東西。我只需要一個正確的方向。 – nav

+0

有一個很好的答案顯示如何做到這一點[這裏](http://stackoverflow.com/questions/320089/how-do-i-bind-a-wpf-datagrid-to-a-variable-number-of - 列),還有一篇關於它的文章[這裏](http://www.codeproject.com/Tips/676530/How-to-Add-Columns-to-a-DataGri),它使用了類似的技術。 –

回答

2

假設你已經設置了正確的DataContext在您看來,您使用的是您的Binding構造的路徑不正確。您只需將屬性名稱/路徑傳遞給Binding構造函數即可。您不需要使用{Binding}來傳遞格式化的字符串,就像您在AddColumn方法中所做的一樣。

更新您的AddColumn方法如下:

private DataGridTextColumn AddColumn(int i, string propName) 
{ 
    DataGridTextColumn tc = new DataGridTextColumn(); 
    tc.Header = propName; 
    Binding tcBinding = new Binding(string.Format("Fruits[{0}].FruitCount", i)); 
    tc.Binding = tcBinding; 
    return tc; 
} 

參閱MSDN這些網頁上BindingData Binding Overview更好地瞭解數據綁定。

這是找零的AddColumn方法後的輸出:

enter image description here