【问题标题】:UI Issue when dynamically binding a list of objects to a DataGrid将对象列表动态绑定到 DataGrid 时的 UI 问题
【发布时间】:2012-02-22 12:23:57
【问题描述】:
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;

当列表绑定到数据网格时,它只显示以下列; ContainingObjectIDObj

  1. 我如何在不修改 (edit:XAML) 并为 ContainedObject 本身的 ContainedObject 中的每个成员创建属性的情况下,让数据网格显示以下列; ContainingObjectID, Obj, ID, Height, Width?

  2. 我该怎么做才能让Obj(它返回ContainedObject)列在每一行的单元格中实际显示一些内容?

【问题讨论】:

  • “不修改 WPF”指定了什么?你是说 XAML 吗?
  • 是的,对不起,我就是这个意思。

标签: c# wpf binding user-interface datagrid


【解决方案1】:

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 列中显示其他内容,请覆盖ContainedObject.ToString() 方法,因为默认情况下,WPF 将编写它不知道如何在 UI 中绘制的任何类的 .ToString() 方法。

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);
    }
}

【讨论】:

  • 感谢您的快速回复。我想保留默认行为以自动生成启用的列。有没有办法让“DataGrid”从位于“ContainedObject”中的公共属性生成列?我还覆盖了 'ContainedObject' ToString 函数,它仍然在单元格内不显示任何内容。
  • @layern9ne DataGrid 仅设计为直接读取数据对象本身的属性,而不是任何子属性。如果您想要不同的行为,则必须覆盖 DataGrid 以实现您自己的逻辑。
  • 谢谢!通过将column.IsReadOnly 更改为true,我能够解决在Obj 列单元格中看不到任何内容的问题。
猜你喜欢
  • 1970-01-01
  • 2015-01-16
  • 2012-05-25
  • 2014-06-29
  • 2019-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
相关资源
最近更新 更多