C# 以编程方式创建的WPF DataGrid列未绑定
我的Xaml如下所示:C# 以编程方式创建的WPF DataGrid列未绑定,c#,wpf,xaml,datagrid,C#,Wpf,Xaml,Datagrid,我的Xaml如下所示: <DataGrid Name="gridBasket" AutoGenerateColumns="False"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding BasketName}"> </DataGridTextColumn> </DataGrid.Columns> </DataGrid>
<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 }
}
}
};
}
}
公共类水果
{
public int水果ID{get;set;}
公共字符串名称{get;set;}
公共计数{get;set;}
}
公共类篮子
{
public int BasketId{get;set;}
公共字符串BasketName{get;set;}
公共可观测收集结果{get;set;}
}
公营商店
{
公共静态ObservableCollection绑定()
{
返回新的ObservableCollection
{
新篮子{BasketId=1,BasketName=“Gold”,
水果=新的可观察到的收集
{
新水果{FROUTCID=1,FROUTCNAME=“橙子”,FROUTCOUNT=10},
新水果{FROUTCID=2,FROUTCNAME=“苹果”,FROUTCUNT=8},
新水果{FROUTCID=3,FROUTCNAME=“香蕉”,FROUTCUNT=6}
}
},
新篮子{BasketId=2,BasketName=“Silver”,
水果=新的可观察到的收集
{
新水果{FROUTCID=1,FROUTCNAME=“橙子”,FROUTCOUNT=5},
新水果{FROUTCID=2,FROUTCNAME=“苹果”,FROUTCUNT=4},
新水果{FROUTCID=3,FROUTCNAME=“香蕉”,FROUTCUNT=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;
}
private void LoadData()
{
gridBasket.AutoGenerateColumns=false;
ObservableCollection bColl=DemoBEL.Shop.Bind();
gridBasket.ItemsSource=bColl;
int i=0;
foreach(DemoBEL.Fruit fObj在bColl[0]中,水果)
{
gridBasket.Columns.Add(AddColumn(i,fObj.fruthName));
i++;
}
}
私有DataGridTextColumn AddColumn(int i,string propName)
{
DataGridTextColumn tc=新DataGridTextColumn();
tc.Header=propName;
String binding=String.Format(“{{binding Path=Fruits[{0}].{1}}}”,0,“FruitCount”);
绑定tcBinding=新绑定(绑定);
tc.Binding=tcBinding;
返回tc;
}
伯爵空了。但是,如果我将相同的绑定与固定值放在一起,则计数开始出现。我应该做哪些更改,以使每个水果的计数开始出现在数据网格中标题中指定水果的下面
假设您已经在视图上设置了正确的路径,那么您在
绑定
构造函数中使用的路径是不正确的。您只需要将属性名/路径传递给绑定构造函数。您不需要像在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;
}
请参阅和上的这些MSDN页面,以更好地了解数据绑定
以下是更改AddColumn方法后的输出:
为什么不使用绑定?动态创建的列和数据绑定不是相互排斥的概念。@MarkFeldman只要从提供的类中获得所需的输出,我愿意使用任何东西。我只需要朝着正确的方向努力。有一个很好的答案展示了如何做到这一点,还有一篇关于它的文章使用了类似的技术。