2012-01-25 9 views
7

私は固定数の列と不明な行数のグリッドを持っています。行数はコンストラクタで1回設定されます。ItemsPanelTemplateのGridにRowDefinitionを動的に追加するにはどうすればよいですか?

<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

あなたは、これらのプロパティを設定または変更されRowDefinitionsColumnDefinitionsを変更Gridためattached propertiesを使用することができます。

は、それはあなたのGridこのように書くことができるようになります:

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

は、それからちょうど Cellsコレクション内の最大行数を返しますあなたの ViewModelからプロパティを公開します。

これらのプロパティの詳細な実装はon my blogです。

+0

ありがとうございました。私は安心しています:)そして途中で最後の2つの方法には小さな間違いがありました。私はそれらを次のように変更しました:GetStarColumns(グリッド).Split( '、'); – Bijan

+0

@Bizzありがとう:)最初に私はすべての特殊文字を取り除いたワードプレスにコードをコピーしたので、二重引用符で一重引用符を誤って置き換えているに違いありません。ある日に複数のスターカラムが必要になり、それを文字列に更新することを決めたあと、スターのカラム/ローが整数だったので、余分な '.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あなたはおそらくそれ以外の何かをしています。 –

関連する問題