C# 将对象列表动态绑定到DataGrid时的UI问题

C# 将对象列表动态绑定到DataGrid时的UI问题,c#,wpf,binding,user-interface,datagrid,C#,Wpf,Binding,User Interface,Datagrid,当列表绑定到datagrid时,它只显示以下列;包含objectid和Obj 如何在不修改edit:XAML并在ContainedObject本身中为ContainedObject内的每个成员创建属性的情况下,让datagrid显示以下列;包含对象、对象、ID、高度、宽度 我该怎么做才能让Obj返回一个ContainedObject列来实际显示每行单元格中的内容 DataGrid的默认行为是自动生成列,这意味着它将查看对象并为对象上的每个公共属性创建列 要更改此行为,可以将AutoGenerat

当列表绑定到datagrid时,它只显示以下列;包含objectid和Obj

如何在不修改edit:XAML并在ContainedObject本身中为ContainedObject内的每个成员创建属性的情况下,让datagrid显示以下列;包含对象、对象、ID、高度、宽度

我该怎么做才能让Obj返回一个ContainedObject列来实际显示每行单元格中的内容

DataGrid的默认行为是自动生成列,这意味着它将查看对象并为对象上的每个公共属性创建列

要更改此行为,可以将AutoGenerateColumns设置为False,并手动将自己的列添加到DataGrid。这就是我的建议

class ContainingObject
{
    private ContainedObject objContained;

    public int ContainingObjectID { get; set; }
    public ContainedObject Obj { get { return objContained; } }

    // Methods that initalize contained objects and such <here>
}

class ContainedObject
{
    public int ID { get; set; }
    public int Height { get; set; }
    public int Width { get; set; }
}

// Binding Code
List<ContainingObject> lstContainingObjects = new List<ContainingObject>();
// Code to Populate List <here>
dtgrdTheDataGrid.ItemsSource = lstContainingObjects;

不修改WPF会指定什么?你是说XAML吗?是的,对不起,我就是这个意思。谢谢你的迅速回复。我希望保持自动生成列的默认行为处于启用状态。有没有办法让“DataGrid”从“ContainedObject”中的公共属性生成列?我还将“ContainedObject”重写为String函数,但它在单元格中仍然不显示任何内容。@layern9ne数据网格仅用于直接读取数据对象本身的属性,而不是任何子属性。如果你想要一个不同的行为,你必须覆盖DataGrid来实现你自己的逻辑。谢谢!通过将column.IsReadOnly更改为true,我能够解决在Obj列单元格中看不到任何内容的问题。
<DataGrid x:Name="dtgrdTheDataGrid" AutoGenerateColumns="False">
    <DataGrid.Columns>        
        <DataGridTextColumn Header="ContainingObjectId" Binding="{Binding ContainingObjectID }" />      
        <DataGridTemplateColumn Header="ContainedObject">
            <DataTemplate>
                <TextBlock Text="Whatever you want here" />
            </DataTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn Header="ContainedObjectId" Binding="{Binding ContainedObject.Id}" />  
        <DataGridTextColumn Header="Height" Binding="{Binding ContainedObject.Height}" />
        <DataGridTextColumn Header="Width" Binding="{Binding ContainedObject.Width}" />
    </DataGrid.Columns>
</DataGrid>
class ContainingObject
{
    private ContainedObject objContained;

    public int ContainingObjectID { get; set; }
    public ContainedObject Obj { get { return objContained; } }

    // Of course, you should include a check for if objContained is null
    public int ContainedObjectId { get { return objContained.Id; } }
    public int ContainedObjectHeight { get { return objContained.Height; } }
    public int ContainedObjectWidth { get { return objContained.Width; } }

}

class ContainedObject
{
    public int ID { get; set; }
    public int Height { get; set; }
    public int Width { get; set; }

    public override ToString()
    {
        // Return whatever you want here
        return string.format("Contained object: {0}", ID);
    }
}