2012-01-25 23 views
7

Tôi có Lưới có số cột cố định và số hàng không xác định. Số lượng hàng được đặt trong hàm tạo một lần.Làm cách nào để tự động thêm RowDefinition vào Grid trong một 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> 

Tôi đã cố gắng các dòng mã sau đây nhưng nó trả về null:

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

Làm thế nào tôi có thể thêm hàng để "myGrid" trong mã?

Trả lời

22

Bạn có thể sử dụng attached properties cho một Grid rằng thay đổi RowDefinitionsColumnDefinitions khi những thuộc tính được thiết lập hoặc thay đổi.

Nó sẽ cho phép bạn viết của bạn Grid như thế này:

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

Sau đó chỉ cần tiếp xúc với một tài sản từ ViewModel của bạn mà trả về số hàng lớn nhất trong bộ sưu tập Cells.

Bạn có thể tìm thấy việc triển khai chi tiết các thuộc tính đó on my blog.

+0

Cảm ơn rất nhiều. Tôi cảm thấy nhẹ nhõm :) và bằng cách có một sai lầm nhỏ trong hai phương pháp cuối cùng. Tôi đã thay đổi chúng thành: GetStarColumns (grid) .Split (','); – Bijan

+0

@Bizz Cảm ơn bạn :) Lần đầu tiên tôi sao chép mã để wordpress nó đã thoát khỏi tất cả các ký tự đặc biệt và tôi phải thay thế các dấu nháy đơn với dấu ngoặc kép do nhầm lẫn. '.ToString()' bổ sung đã có bởi vì các cột/hàng sao đã từng là số nguyên trước khi tôi cần nhiều cột sao một ngày và quyết định cập nhật cột thành một chuỗi – Rachel

+1

Liên kết ngoài trang web là xấu, bạn nên biết rằng, bạn nên trình bày ý tưởng cơ bản (ràng buộc các thuộc tính đính kèm và đặc tính xử lý thay đổi thực sự thay đổi lưới) và liên kết chỉ là chi tiết thực hiện cho người lười. –

-1

Chỉ cần sử dụng myItemsControl.GetTemplatedChild("myGrid") được insted. Ngoài ra, bạn kiểm soát phải được tải trước khi bạn có thể bắt đầu sử dụng biểu thức ở trên.

+0

'ItemsControl' không có phương thức' GetTemplateChild' – Bijan

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

Điều này sẽ không hữu ích. Tôi không thể truy cập 'myGrid' bằng tên của nó từ bên trong mã. – Bijan

+0

tôi có thể ... điều này làm việc tốt cho tôi – WtFudgE

+0

Bạn không thể truy cập * bất kể nó là gì * khi nó là ItemPanelTemplate của một ItemsControl. @ WtFudgE bạn có thể đang làm điều gì khác hơn thế. –

Các vấn đề liên quan