背景:我想在GridView中显示库存项目列表。很容易。但是,每个库存项目都有一个与之关联的价格清单。目前我使用5种可能的价格表,但是,价格表的数量没有设定,可以是任何数字(在合理范围内)。我想在单独的列中在网格视图中显示这些价格。我在网格视图中动态生成列(基于我发现的here,Dan Parsonson发布的第二个示例)。但是,我无法弄清楚如何绑定到ObservableCollection中的List。我已经找了一段时间,但我还没找到任何与这种情况相关的东西。
大大减少了StockItem的定义:
public class StockItem
{
public string StockCode { get; set; }
public int StockToHand { get; set; }
public List<ListPrice> Prices { get; set; }
}
ListPrice只包含Name的字符串和价格的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中看不到任何数据。我显然需要做更多的工作才能将数据传输到视图中,但经过大量搜索后我无法找到明显的解决方案。
答案 0 :(得分: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" });
}
它还不完美,但我不知道我可以在这样的绑定中使用索引,并且不认为我已经在互联网上的任何其他地方看到过它了!
如果这个解决方案出于任何原因不理想,那么请随意指出/纠正我。