Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 以编程方式创建的WPF DataGrid列未绑定_C#_Wpf_Xaml_Datagrid - Fatal编程技术网

C# 以编程方式创建的WPF DataGrid列未绑定

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>

我的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 }
                }
            }
        };
    }
}
公共类水果
{
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只要从提供的类中获得所需的输出,我愿意使用任何东西。我只需要朝着正确的方向努力。有一个很好的答案展示了如何做到这一点,还有一篇关于它的文章使用了类似的技术。