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

时间:2012-01-30 17:57:34

标签: c# wpf binding user-interface 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;

当列表绑定到datagrid时,它只显示以下列; ContainingObjectIDObj

  1. 如何在不修改(编辑:XAML)并为ContainedObject本身的ContainingObject内的每个成员创建属性的情况下,获取数据网格以显示以下列; ContainingObjectIDObjIDHeightWidth

  2. 如何让Obj(它返回一个ContainedObject)列实际显示每行的单元格中的某些内容?

1 个答案:

答案 0 :(得分:0)

DataGrid的默认行为是AutoGenerateColumns,这意味着它将查看您的对象并为该对象上的每个公共属性创建一列。

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

<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>

如果您不想构建自己的列,可以展开ContainingObject类以包含ContainedObject属性的公共属性。要在Obj列中显示其他内容,请覆盖.ToString()的{​​{1}}方法,因为默认情况下WPF将编写任何类的ContainedObject方法,但不知道如何在UI中绘制。

.ToString()