当绑定的数据包含列表时,WPF绑定GridView

本文关键字:绑定 WPF GridView 数据包 列表 | 更新日期: 2023-09-27 18:20:45

背景:我想在GridView中显示库存项的列表。很简单。然而,每个库存项目都有一个与之相关的价格列表。目前我使用5个可能的价格列表,但是,价格列表的数量没有设置,可以是任何数字(在合理范围内)。我想在网格视图中以单独的列显示这些价格。我正在网格视图中动态生成列(基于我在这里发现的内容,Dan Parsonson发布的第二个示例)。然而,我不知道如何绑定到ObservableCollection中的List。我已经搜索了一段时间,但我还没有找到任何与这种情况相关的东西。

大幅减少库存项目定义:

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

ListPrice只包含一个Name字符串和一个Price Decimal。

我将列添加到网格视图中,如下所示:

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中没有看到任何数据。我显然需要做更多的工作来将数据传递到视图中,但经过大量搜索,我找不到明显的解决方案。

当绑定的数据包含列表时,WPF绑定GridView

我想我应该自己回答这个问题,因为我想明白了,意识到我有点暴躁。以下内容:

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" });
}

它还不完美,但我不知道我可以在这样的绑定中使用索引,而且我想我在互联网上的其他地方也没有见过!

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