2015-11-05 99 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" }); 
} 

这还不是很完善,但我不知道我能在这样的一个结合使用的索引,并且不认为我已经看到了它在互联网上的任何其他地方!

如果此解决方案因任何原因不理想,请随时指出/纠正我。