2012-01-30 72 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