2011-11-18 34 views
0

我試圖用自動生成列創建一個數據網格。 假設我的收藏是我的ObservableCollection<ArticleWrapper>類型的視圖模型Articles的屬性。Datagrid:從ItemsSource集合的一個屬性生成列

我現在綁定的ItemsSource到這個集合:

<wpf:DataGrid ItemsSource={Binding Articles} /> 

ArticleWrapper是這樣的:

[c#] 
public class ArticleWrapper 
{ 
    public ArticleConfigurationSet ArticleConfigurationSet { get; set; } 
    public string Description { get; set; } 
} 


[vb.net] 
Public Class ArticleWrapper 
    Public Property ArticleConfigurationSet As ArticleConfigurationSet 
    Public Property Description As String 
End Class 

ArticleConfigurationSet是這樣的:

[c#] 
public class ArticleConfigurationSet 
{ 
    public string Key { get; set; } 
    public int Number { get; set; } 
} 

[vb.net] 
Public Class ArticleConfigurationSet 
    Public Property Key As String 
    Public Property Number As Integer 
End Class 

自動生成的列看起來像這樣(請忘記CustomEntries) : enter image description here

但現在我的問題:我想要顯示的數據綁定到我的ArticleConfigurationSet屬性。但我無法更改我的ItemsSource綁定,因爲數據網格的SelectedItem屬性必須爲ArticleWrapper(用於命令處理)。

數據網格也應該是這樣的: enter image description here

你有什麼想法如何做到這一點?

+0

我會用linq生成一個更友好的視圖模型,並在舊的方式做...但感謝所有的答案。 –

回答

1

爲什麼不設置AutoGenrateColumns = false並根據您的ArticleConfigurationSet屬性創建動態的gridcolumns和bindings?

你不必改變視圖,你可以做你想做的。

編輯:我的意思是你可以遍歷你的ArticleConfigurationSet屬性(例如用反射)並創建Gridcolumns和綁定。

foreach(var p in properties) 
{ 
     //grid add new gridcolumn 
     //set binding to ArticleConfigurationSet Property Name 
     var b = new Binding("ArticleConfigurationSet"+p.Name); 
     //add binding to gridcolumn 
} 
+0

這不是我的問題。顯示的列應該從我的對象自動生成。而且我不想這樣做由xaml修復,因爲在更高版本中對象可以(並且將會)改變。 –

+0

多數民衆贊成多數民衆贊成在你想要自動生成網格的對象不是你綁定的對象。所以你必須自己做一些事情。 – blindmeis

1

設置AutoGenrateColumns =假和使用的ItemTemplate拉布勒並將其綁定到你想要的字段或屬性。

+0

這將工作,但我想自動生成所有的列,所以如果有新的屬性,我不需要改變視圖。 –

2

您可以同時AutoGenerateColumns="True",並定義自己的自定義列

例如,

<DataGrid ItemsSource="{Binding Articles}" 
      AutoGenerateColumns="True" 
      AutoGeneratingColumn="DataGrid_AutoGeneratingColumn"> 
    <DataGrid.Columns> 
     <DataGridColumn Binding="{Binding ArticleConfigurationSet.Key}" Header="Key" /> 
     <DataGridColumn Binding="{Binding ArticleConfigurationSet.Value}" Header="Value" /> 
    </DataGrid.Columns> 
</DataGrid> 

// If we are auto-generating the ArticleConfigurationSet column, 
// cancel it so that column doesn't get rendered 
void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
{ 
    if(e.ColumnName == "ArticleConfigurationSet") 
     e.Cancel = true; 
} 

您可能需要做一些代碼隱藏,如果你想重新排列列的順序,但是這應該會自動生成對象中除ArticleConfigurationSet列之外的所有內容的列,並且還會爲ArticleConfigurationSet.KeyArticleConfigurationSet.Value

添加兩個其他列
+0

他只需要ArticleConfigurationSet的列,而不需要其他 - 或? – blindmeis

+0

@blindmeis這聽起來像他正在尋找一種方法來自動生成所有的列,除了'ArticleConfigurationSet'列,他希望顯示爲兩個特定的列顯示'Key'和'Value'。這個解決方案做到了。 – Rachel

相關問題