2012-01-30 77 views
1
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将对象列表动态绑定到DataGrid时的UI问题

  1. 我该如何,而无需修改(编辑:XAML),并在ContainingObject本身ContainedObject内的每个成员创建的特性,得到了数据网格,以显示下面的列; ContainingObjectID,Obj,ID,Height,Width

  2. 我能做些什么来获得Obj(它返回ContainedObject)列来实际显示每行的单元格中的东西?

+0

什么“没有修改WPF”指定?你的意思是XAML? – 2012-01-30 18:37:26

+0

对不起,这就是我的意思。 – layern9ne 2012-01-30 19:32:31

回答

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列中显示其他内容,请覆盖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); 
    } 
} 
+0

感谢您的迅速回复。我想保持默认行为来自动生成启用的列。有没有办法让'DataGrid'从'ContainedObject'中的公共属性生成列?我也覆盖了'ContainedObject'ToString函数,它仍然在单元格内不显示任何内容。 – layern9ne 2012-01-30 20:09:19

+0

@ layern9ne DataGrid仅用于直接读取数据对象本身的属性,而不是任何子属性。如果你想要一个不同的行为,你必须重写DataGrid来实现你自己的逻辑。 – Rachel 2012-01-30 20:14:10

+0

谢谢!通过将'column.IsReadOnly'更改为true,我能够解决无法在'Obj'列单元格中看到任何内容的问题。 – layern9ne 2012-01-30 21:48:10