2012-01-25 72 views
7

我有一個固定數量的列和未知行數的網格。行數在構造函數中設置一次。如何動態添加RowDefinition到ItemsPanelTemplate中的網格?

<ItemsControl Name="myItemsControl" ItemsSource="{Binding Cells}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Grid Name="myGrid"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition/> 
        <ColumnDefinition/> 
        <ColumnDefinition/> 
       </Grid.ColumnDefinitions> 
       <Grid.RowDefinitions> 
        <!-- some rows should be added here --> 
       </Grid.RowDefinitions> 
      </Grid> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemContainerStyle> 
     <Style.../> 
    </ItemsControl.ItemContainerStyle> 
</ItemsControl> 

我已經嘗試下面的代碼行,但它返回null:

object obj = myItemsControl.Template.FindName("myGrid", myItemsControl); 

我怎樣才能在代碼行添加到「myGrid」?

回答

22

可以使用attached propertiesGrid該修改RowDefinitionsColumnDefinitions當這些屬性被設置或更改。

它可以讓你寫你的Grid這樣的:

<Grid local:GridHelpers.RowCount="{Binding MaxGridRow}" 
     local:GridHelpers.ColumnCount="3" /> 

然後,只需從你的ViewModel它返回Cells集合中的最大行數暴露的屬性。

你可以找到這些屬性的詳細實現on my blog

+0

非常感謝。我感到放心:)順便說一下,在最後兩種方法中有一個小錯誤。我將它們更改爲:GetStarColumns(grid).Split(','); – Bijan

+0

@Bizz謝謝:)第一次我將代碼複製到wordpress中,它刪除了所有特殊字符,我必須用雙引號替換單引號。額外的'.ToString()'是在那裏,因爲在我需要多個星列之前,星列/行曾經是一個整數,並決定將它更新爲一個字符串 – Rachel

+1

異地鏈接是不好的,你應該知道,你應該提出基本的想法(綁定附加屬性和屬性改變的處理器imeratively修改網格),鏈接只是懶惰的人的實現細節。 –

-1

只使用myItemsControl.GetTemplatedChild("myGrid") insted。另外,在開始使用上述表達式之前,您必須先加載控件。

+0

'ItemsControl'沒有'GetTemplateChild'方法 – Bijan

9
var rowDefinition = new RowDefinition(); 
rowDefinition.Height = GridLength.Auto; 
grid.RowDefinitions.Add(rowDefinition); 
+0

這沒有幫助。我無法通過代碼中的名稱訪問「myGrid」。 – Bijan

+0

我可以...這對我來說工作得很好 – WtFudgE

+0

當它是ItemsControl的ItemPanelTemplate時,您無法訪問它。 @WtFudgE你可能在做別的事情。 –

相關問題