2015-11-05 66 views
0

背景:我想在GridView中顯示股票項目列表。很簡單。但是,每個庫存項目都有一個與其相關的價格清單。目前,我使用5種可能的價目表,但是,價目表的數量未設置,可能是任何數量(合理範圍內)。我想在單獨的欄目中顯示網格視圖中的價格。我在網格視圖中動態生成列(基於我發現的丹帕爾森森發佈的第二個示例here)。但是,我無法弄清楚如何綁定到ObservableCollection中的列表。我一直在尋找一段時間,但我還沒有找到任何與這種情況相關的東西。WPF在綁定數據包含列表時綁定GridView

大大降低StockItem定義:

public class StockItem 
{ 
    public string StockCode { get; set; } 
    public int StockToHand { get; set; } 
    public List<ListPrice> Prices { get; set; } 
} 

ListPrice只是包含了名稱和價格一個十進制的字符串。

我的列添加到網格視圖這樣的:

private void UpdateColumns() 
{ 
    ObservableCollection<ColumnDescriptor> columns = new ObservableCollection<ColumnDescriptor>(); 
    columns.Add(new ColumnDescriptor 
       { HeaderText = "Stock Code", DisplayMember = "StockCode" }); 
    columns.Add(new ColumnDescriptor 
       { HeaderText = "Stock To Hand", DisplayMember = "StockToHand" }); 

    // Add price list columns 
    List<PriceList> priceLists = GetPriceLists(); 
    foreach(PriceList pl in priceLists) 
    { 
     colums.Add(new ColumnDescriptor 
        { HeaderText = pl.Name, DisplayMember = "Prices.Price" }); 
    } 
    GridViewColumns = columns; 
} 

GetPriceLists()只是抓住所有數據庫中定義的,所以我可以命名爲所有可能的價格表列價格表。 ColumnDescriptor只是一個簡單的類,用於包含列名和顯示成員的路徑。 GridViewColumns是GridView查看列的地方。

XAML:

<ListView ItemsSource="{Binding CurrentStockItems}" SelectedItem="{Binding SelectedStockItem}"> 
    <ListView.View> 
     <GridView Helpers:GridViewColumnCollection.DisplayMemberMember="DisplayMember" 
        Helpers:GridViewColumnCollection.HeaderTextMember="HeaderText" 
        Helpers:GridViewColumnCollection.ColumnsSource="{Binding GridViewColumns}"/> 
    </ListView.View> 
</ListView> 

最終我在尋找一個GridView,看起來有點像這樣:

+----------+-------------+------------+------------+ 
|Stock Code|Stock To Hand|List 1 Price|List 2 Price| 
+----------+-------------+------------+------------+ 
| 12345 |  1  | 45.95 | 40.23 | 
+----------+-------------+------------+------------+ 

如果從信息中產生的最後2個(或包含很多列) List或其他集合,並且GridView中的每一行都由1個對象(例如上面公佈的StockItem類)包含。我很希望(瘋狂地)把DisplayMember = "Prices.Price"(在第二個代碼塊中)調用某種WPF魔術來獲取數據到GridView中,但不幸的是,我在GridView中看不到任何數據。我顯然需要做更多的工作才能將數據傳遞給視圖,但經過大量搜索後,我找不到明顯的解決方案。

+0

您可以(應該)將這些列添加到您的ViewModels並讓View使用自動生成或固定的列。 –

+0

我不認爲GridView可以自動生成列,固定列也不合適,因爲列數會有所不同。 – Tominator

+0

爲了澄清,UpdateColumns是視圖模型的一部分。 – Tominator

回答

0

我想我應該自己回答這個問題,因爲我知道了,並且意識到自己有點狡猾。以下:

foreach(PriceList pl in priceLists) 
{ 
    colums.Add(new ColumnDescriptor 
       { HeaderText = pl.Name, DisplayMember = "Prices.Price" }); 
} 

可改爲:

foreach(PriceList pl in priceLists) 
{ 
    columns.Add(new ColumnDescriptor 
       { HeaderText = pl.Name, 
       DisplayMember = "Prices[" + priceLists.IndexOf(pl) + "].Price" }); 
} 

這還不是很完善,但我不知道我能在這樣的一個結合使用的索引,並且不認爲我已經看到了它在互聯網上的任何其他地方!

如果此解決方案因任何原因不理想,請隨時指出/糾正我。