Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.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# 使用对象从列表绑定_C#_Wpf_Binding - Fatal编程技术网

C# 使用对象从列表绑定

C# 使用对象从列表绑定,c#,wpf,binding,C#,Wpf,Binding,在此输入代码我的对象属性不会显示在Datagrid上 我希望列类别中有一个字符串,它是在本项目的XAML中定义的。“Id”和“描述”成功显示在DataGrid上,但“类别”未显示。请参见下面的屏幕截图 <Grid> <DataGrid Name="view" AutoGenerateColumns="False" Margin="-4,0,4,0" > <DataGrid.Columns> <DataGr

在此输入代码我的对象属性不会显示在Datagrid上

我希望列类别中有一个字符串,它是在本项目的XAML中定义的。“Id”和“描述”成功显示在DataGrid上,但“类别”未显示。请参见下面的屏幕截图

<Grid>
    <DataGrid Name="view" AutoGenerateColumns="False" Margin="-4,0,4,0" >
        <DataGrid.Columns>

            <DataGridTextColumn Header="#" Binding="{Binding Id}" />

            <DataGridTemplateColumn Header="Category">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Label Content="{Binding Category.Name}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

            <DataGridTemplateColumn Header="Description">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Label Content="{Binding Beschreibung}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>
这是我的分类课

    public partial class Category
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Category()
    {
        Payments = new HashSet<Payment>();
    }
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Id { get; set; }

    [Required]
    [StringLength(500)]
    public string Name { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Payment> Payments { get; set; }
}
公共部分类类别
{
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2214:DoNotCallOverridableMethodsInConstructors”)]
公共类别()
{
付款=新的HashSet();
}
[数据库生成(DatabaseGeneratedOption.None)]
公共int Id{get;set;}
[必需]
[长度(500)]
公共字符串名称{get;set;}
[System.Diagnostics.CodeAnalysis.SuppressMessage(“Microsoft.Usage”,“CA2227:CollectionPropertiesShouldBreadOnly”)]
公共虚拟ICollection付款{get;set;}
}

实现MVVM模式更好,请查看:


因此,您的错误在于,在linq中,您选择了p(付款),并且可能在那里Category属性为空。您可以快速查看查询结果并查看它。

尝试更改此代码

payments = (from c in dc.Categories
    join p in dc.Payments
    on c.Id equals p.CategoryId
    select p)
    .ToList();


它将急切地从数据库中加载
类别
,它将解决您的问题。

您能否共享您的DataContext,类别和付款类?显示您的类别和付款类。现在显示这两个类,是不是有点递归,因为您在付款的类别中有付款列表?我调试了我的程序及其奇妙之处,有时对象付款中的属性类别为空,有时不是,没有我的改变,一切都会好起来!!!谢谢你,亚历山大,你能解释一下我的选择和你的选择有什么不同吗?(我是实体框架的新手)@Nikolamotovic请看这个文档。很快,默认情况下,所有标记为
virtual
的属性都是延迟加载的。这意味着当您从数据库中选择它们时,它们不会被任何数据填充。但是,当您在代码中引用属性时,数据被加载。但似乎WPF在绑定其值时并没有引用property。因此,您只需手动告诉EF在单个请求中为您加载此实体。
    public partial class Category
{
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
    public Category()
    {
        Payments = new HashSet<Payment>();
    }
    [DatabaseGenerated(DatabaseGeneratedOption.None)]
    public int Id { get; set; }

    [Required]
    [StringLength(500)]
    public string Name { get; set; }

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
    public virtual ICollection<Payment> Payments { get; set; }
}
payments = (from c in dc.Categories
    join p in dc.Payments
    on c.Id equals p.CategoryId
    select p)
    .ToList();
payments = (from c in dc.Categories
    join p in dc.Payments
    on c.Id equals p.CategoryId
    select p)
    .Include("Category")
    .ToList();