2009-07-31 108 views
2

我有一個只有1行的網格。我希望列的數量由網格的數據上下文決定。例如,如果我有一個名爲'Names'的ObservableCollection屬性中顯示的名稱列表,它返回「Fred」,「Joe」和「Anne」,我希望網格中有三列,每列都有一個文本框綁定到每個名稱。WPF Grid數據綁定

我的想法至今:

1)建立由專人在代碼背後的電網和重建它的ObservableCollection改變時。我沒有這樣做,因爲它看起來有些狡猾,而不是WPF的做事方式。

2)使用Grid的ColumnDefinitions屬性創建一個綁定。這看起來更加正確,但GridDefinition沒有依賴屬性。

+1

你想要一個Grid或DataGrid嗎? – kenwarner 2009-12-11 22:01:24

回答

3

我不認爲即時修改Grid是最佳選擇。這是另一種解決方案。您可以使用ListBox,但用您選擇的另一個面板替換ItemsPanel。 ListBox的默認ItemsPanel是VirtualizingStackPanel,方向設置爲Vertical。由於您希望項目水平顯示,因此可以使用定向設置爲水平的VirtualizingStackPanel替換它。當然,你可以修改ItemsTemplate或其他你認爲合適的東西。

<ListBox ItemsSource="{Binding MyCollection}"> 
    <ListBox.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel Orientation="Horizontal"/> 
     </ItemsPanelTemplate> 
    </ListBox.ItemsPanel> 
</ListBox> 

我也用這個方法之前,創造出水平顯示的項目列表框,但是當它運行的空間就行了,用WrapPanel換到下一行。您也可以創建自己的自定義面板並替換它們。我曾經制作過一個隨機佈置它的項目,並將其用於ListBox。我的綁定集合中的每個項目都顯示在ListBox中的隨機位置。每次佈局刷新時,這些項目都有了新的位置。

2

如果您可以接受每行中的名稱而不是每列,則應該使用帶有GridView View屬性的ListView以及僅爲綁定文本框的自定義CellTemplate。類似這樣的:

​​

解決方案#2在XAML中不幸是不可能的。解決方案#1是你最好的選擇,如果你必須在自己的專欄中有每個名字。