【问题标题】:WPF Binding a GridView when that bound data contains a list当绑定数据包含列表时,WPF绑定GridView
【发布时间】:2016-02-06 09:49:35
【问题描述】:

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

大大减少 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    |
+----------+-------------+------------+------------+

最后两列(或多列)是从 List 或其他集合中的信息生成的,并且 GridView 中的每一行都包含在 1 个对象中(例如上面发布的 StockItem 类)。

我(疯狂地)希望将DisplayMember = "Prices.Price"(在第二个代码块中)放入某种 WPF 魔法以将数据放入 GridView,但不幸的是,我在 GridView 中看不到任何数据。我显然需要做更多工作才能将数据传递到视图中,但经过大量搜索后,我找不到明显的解决方案。

【问题讨论】:

  • 您可以(应该)将这些列添加到您的 ViewModel 并让 View 使用自动生成或固定的列。
  • 我认为GridView不能自动生成列,固定列不合适,因为列数会有所不同。
  • 澄清一下,UpdateColumns 是视图模型的一部分。
  • 好吧...我明白了,伙计们...我是个白痴...原来 DisplayMember = "Prices[" + priceLists.IndexOf(pl) + "].Price" 有效.现在我知道这是可行的(不知道为什么我不早点尝试)我可以弄清楚如何使它更健壮。

标签: c# wpf gridview mvvm


【解决方案1】:

我想我应该自己回答这个问题,因为我想通了并且意识到我有点傻。以下:

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

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

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

【讨论】:

    猜你喜欢
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 2010-11-24
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    相关资源
    最近更新 更多