2012-01-25 12 views
7

Mam siatkę o stałej liczbie kolumn i nieznanej liczbie wierszy. Liczba wierszy jest ustawiona w konstruktorze jeden raz.Jak mogę dynamicznie dodać obiekt RowDefinition do siatki w ItemPanelTemplate?

<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> 

mam stara następującą linię kodu, ale zwraca wartość null:

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

Jak mogę dodać wiersze do „myGrid” w kodzie?

Odpowiedz

22

Można użyć attached properties dla Grid że zmodyfikować RowDefinitions i ColumnDefinitions gdy te właściwości są ustawione lub zmienione.

To pozwoli Ci napisać jak to Grid:

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

Wtedy właśnie narazić właściwość z ViewModel która zwraca największą liczbę wierszy w kolekcji Cells.

Możesz znaleźć szczegółową realizację tych właściwości on my blog.

+0

Wielkie dzięki. Czuję ulgę :) a przy okazji był drobny błąd w dwóch ostatnich metodach. Zmieniłem je na: GetStarColumns (grid) .Split (","); – Bijan

+0

@Bizz Dziękuję :) Za pierwszym razem, gdy skopiowałem kod do wordpress, pozbyłem się wszystkich znaków specjalnych i musiałem przez pomyłkę zastąpić pojedyncze cudzysłowy podwójnymi cudzysłowami. Dodatkowe '.ToString()' było tam, ponieważ kolumny/rzędy gwiazd były kiedyś liczbą całkowitą, zanim potrzebowałem wielu kolumn gwiazd jeden dzień i postanowiłem zaktualizować je do ciągu znaków – Rachel

+1

Łączenie z witryny jest złe, powinieneś to wiedzieć, powinieneś przedstawić podstawową ideę (powiązanie właściwości dołączonych i zmienionych właściwości obsługi zmieniło siatkę), a link jest po prostu szczegółami implementacji dla leniwych osób. –

-1

Po prostu użyj: myItemsControl.GetTemplatedChild("myGrid"). Ponadto, kontrola musi zostać wczytana zanim zaczniesz używać powyższego wyrażenia.

+0

'ItemsControl' nie ma metody" GetTemplateChild " – Bijan

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

To nie pomoże. Nie mogę uzyskać dostępu do 'myGrid' po nazwie z wewnętrznego kodu. – Bijan

+0

mogę ... to działało dobrze dla mnie – WtFudgE

+0

Nie można uzyskać dostępu * bez względu na to, * gdy jest to ItemPanelTemplate elementu ItemsControl. @WtFudgE prawdopodobnie robisz coś innego. –

Powiązane problemy