【问题标题】:Programmatically created WPF DataGrid Columns not Binding以编程方式创建的 WPF DataGrid 列未绑定
【发布时间】:2016-01-17 10:39:50
【问题描述】:

我的 Xaml 如下所示:

<DataGrid Name="gridBasket" AutoGenerateColumns="False">
   <DataGrid.Columns>
      <DataGridTextColumn Binding="{Binding BasketName}">
      </DataGridTextColumn>
   </DataGrid.Columns>
</DataGrid>

我的班级看起来像:

public class Fruit
{
    public int FruitId { get; set; }
    public string FruitName { get; set; }
    public int FruitCount { get; set; }
 }

public class Basket
{
    public int BasketId { get; set; }
    public string BasketName { get; set; }
    public ObservableCollection<Fruit> Fruits { get; set; }
}

public class Shop
{
    public static ObservableCollection<Basket> Bind()
    {
        return new ObservableCollection<Basket>
        {
            new Basket { BasketId = 1, BasketName = "Gold",
                Fruits = new ObservableCollection<Fruit>
                {
                    new Fruit { FruitId = 1, FruitName = "Oranges", FruitCount = 10 },
                    new Fruit { FruitId = 2, FruitName = "Apples", FruitCount = 8 },
                    new Fruit { FruitId = 3, FruitName = "Bananas", FruitCount = 6 }
                }
            },
            new Basket { BasketId = 2, BasketName = "Silver",
                Fruits = new ObservableCollection<Fruit>
                {
                    new Fruit { FruitId = 1, FruitName = "Oranges", FruitCount = 5 },
                    new Fruit { FruitId = 2, FruitName = "Apples", FruitCount = 4 },
                    new Fruit { FruitId = 3, FruitName = "Bananas", FruitCount = 3 }
                }
            }
        };
    }
}

在我后面的代码中,我尝试动态添加列并将这些动态列的绑定设置为嵌套集合属性。

private void LoadData()
{
    gridBasket.AutoGenerateColumns = false;

    ObservableCollection<DemoBEL.Basket> bColl = DemoBEL.Shop.Bind();
    gridBasket.ItemsSource = bColl;

    int i = 0;
    foreach (DemoBEL.Fruit fObj in bColl[0].Fruits)
    {
        gridBasket.Columns.Add(AddColumn(i, fObj.FruitName));
        i++;
    }
}

private DataGridTextColumn AddColumn(int i, string propName)
{
    DataGridTextColumn tc = new DataGridTextColumn();
    tc.Header = propName;
    String binding = String.Format("{{Binding Path=Fruits[{0}].{1}}}", 0, "FruitCount");
    Binding tcBinding = new Binding(binding);
    tc.Binding = tcBinding;
    return tc;
}

伯爵空了。但是,如果我使用固定值放置相同的绑定,则计数开始出现。我应该进行哪些更改,以便每个水果的计数开始出现在标题中指定水果下的数据网格中。

【问题讨论】:

  • 你为什么不想使用绑定?动态创建的列和数据绑定不是相互排斥的概念。
  • @MarkFeldman 只要我从提供的类中获得所需的输出,我愿意使用任何东西。我只需要朝着正确的方向前进。
  • 有一个很好的 SO 答案展示了如何做到这一点 here,还有一篇关于它的文章 here 使用了类似的技术。

标签: c# wpf xaml datagrid


【解决方案1】:

假设您已经在视图上设置了正确的DataContext,那么您在Binding 构造函数中使用的路径不正确。您只需要将属性名称/路径传递给 Binding 构造函数。您不需要像在 AddColumn 方法中那样使用 {Binding} 传递格式化的字符串。

将您的 AddColumn 方法更新为以下内容:

private DataGridTextColumn AddColumn(int i, string propName)
{
    DataGridTextColumn tc = new DataGridTextColumn();
    tc.Header = propName;
    Binding tcBinding = new Binding(string.Format("Fruits[{0}].FruitCount", i));
    tc.Binding = tcBinding;
    return tc;
}

请参阅 BindingData Binding Overview 上的这些 MSDN 页面,以更好地了解 DataBinding。

这是对 AddColumn 方法进行更改后的输出:

【讨论】:

    猜你喜欢
    • 2010-10-11
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多