2013-05-16 15 views
12

ItemsPanel biçiminde bir ızgara kullanan bir ItemsControl oluşturmaya çalışıyorum; bu, iki sütuna sahiptir, ilk sütun genişliği, o sütunun en geniş öğesinin genişliğidir ve satırlar için gereken satırlar olabilir. tüm öğeleri TemeldeÖğeler denetimi için şablon olarak kılavuz nasıl ayarlanır?

, ben aşağıdakileri istiyorum görüntülemek, ama nedense bu yüzden bir ItemsControl içinde bir nesne koleksiyonu bağlanabildiği:

<Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="auto"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 

     <Grid.RowDefinitions> 
      <RowDefinition Height="auto"/> 
      <RowDefinition Height="auto"/> 
      <RowDefinition Height="auto"/> 
     </Grid.RowDefinitions> 

     <Label Content="{Binding Items[0].Header}"/> 
     <TextBox Text="{Binding Items[0].Content}" Grid.Column="1"/> 

     <Label Content="{Binding Items[1].Header}" Grid.Row="1"/> 
     <TextBox Text="{Binding Items[1].Content}" Grid.Row="1" Grid.Column="1"/> 

     <Label Content="{Binding Items[2].Header}" Grid.Row="2"/> 
     <TextBox Text="{Binding Items[2].Content}" Grid.Row="2" Grid.Column="1"/> 
    </Grid> 

Düzenleme: Rachels cevap burada, amele büyük bir çalışma örneğidir .

(Ben ItemsPanel için Grid.IsSharedSizeScope = "True" taşındı Rachel (işe yaramadı olan) ItemTemplate koymak anlamına emin değilse)

namespace WpfApplication23 
{ 
    public partial class Window1 : Window 
    { 
     public List<Item> Items { get; set; } 

     public Window1() 
     { 
      Items = new List<Item>() 
      { 
       new Item(){ Header="Item0", Content="someVal" }, 
       new Item(){ Header="Item1", Content="someVal" }, 
       new Item(){ Header="Item267676", Content="someVal" }, 
       new Item(){ Header="a", Content="someVal" }, 
       new Item(){ Header="bbbbbbbbbbbbbbbbbbbbbbbbbb", Content="someVal" }, 
       new Item(){ Header="ccccccc", Content="someVal" } 
      }; 

      InitializeComponent(); 

      DataContext = this; 
     } 
    } 

    public class Item 
    { 
     public string Header { get; set; } 
     public string Content { get; set; } 
    } 
} 

<Window x:Class="WpfApplication23.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <ItemsControl ItemsSource="{Binding Items}"> 

     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel Grid.IsSharedSizeScope="True"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 

     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition SharedSizeGroup="ColumnOne" /> 
         <ColumnDefinition Width="*" /> 
        </Grid.ColumnDefinitions> 
        <Label Content="{Binding Header}"/> 
        <TextBox Text="{Binding Content}" Grid.Column="1"/> 
       </Grid> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</Window> 
+1

mükemmel bir kullanım durumu Rachel'ın [Izgara Ekli Özellikler] (http: // rachel53461. wordpress.com/2011/09/17/wpf-grids-rowcolumn-count-properties/) –

+0

Örneklemdeki bir öğenin hem Başlığı hem de içeriği içerdiğinden, bunun nasıl işe yaradığını bilmiyorum. – pastillman

+0

hayal gücünüzü kullanın. Aksi halde işimi bitirmek için bana bir saat ya da öyleyse, sana bir örnek oluşturabilirim. –

cevap

16

birden sorunlar bir ItemsControl burada vardır:

  • sonuncusu ItemsControl

her okunması için birden fazla öğe oluşturuluyor sıralar

  • dinamik numarası oluşturmak büyük kalem
  • genişliğine uyacak biçimde ilk sütunu alınıyor Gerçekten en büyük sorun, bir ItemsControl her ItemTemplate'u ContentPresenter içinde tamamladığından, ItemsControl'un her yinelemesi için panelde birden fazla öğe oluşturmanın varsayılan yolu yoktur.

    <Grid> 
        ... 
    
        <ContentPresenter> 
         <Label Content="{Binding Items[0].Header}"/> 
         <TextBox Text="{Binding Items[0].Content}" Grid.Column="1"/> 
        </ContentPresenter> 
        <ContentPresenter> 
         <Label Content="{Binding Items[1].Header}" Grid.Row="1"/> 
         <TextBox Text="{Binding Items[1].Content}" Grid.Row="1" Grid.Column="1"/> 
        </ContentPresenter> 
        <ContentPresenter> 
         <Label Content="{Binding Items[2].Header}" Grid.Row="2"/> 
         <TextBox Text="{Binding Items[2].Content}" Grid.Row="2" Grid.Column="1"/> 
        </ContentPresenter> 
    </Grid> 
    

    Benim en iyi öneri bir 1X2 Grid içeren bir ItemTemplate oluşturmak olacaktır ve paylaşılan ilk sütunun genişliğini yapmak için Grid.IsSharedSizeScope kullanın: Sizin Sonuçta şu şekilde görünecektir. (ItemsPanelTemplate varsayılan StackPanel kalacaktı.)

    Bu durumda da, sonuçta şu şekilde görünecektir: @ için

    <StackPanel> 
        <ContentPresenter> 
         <Grid IsSharedSizeScope="True"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition SharedSizeGroup="ColumnOne" /> 
           <ColumnDefinition Width="*" /> 
          </Grid.ColumnDefinitions> 
          <Label Content="{Binding Header}"/> 
          <TextBox Text="{Binding Content}" Grid.Column="1"/> 
         </Grid> 
        </ContentPresenter> 
        <ContentPresenter> 
         <Grid IsSharedSizeScope="True"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition SharedSizeGroup="ColumnOne" /> 
           <ColumnDefinition Width="*" /> 
          </Grid.ColumnDefinitions> 
          <Label Content="{Binding Header}"/> 
          <TextBox Text="{Binding Content}" Grid.Column="1"/> 
         </Grid> 
        </ContentPresenter> 
        ... 
    </StackPanel> 
    
  • +0

    Simply Brilliant. –

    +0

    Bu çok işe yaradı, teşekkür etti, (benim düzenlememe bakın) – pastillman

    +1

    Lütfen "Grid.IsSharedScope =" True "' alt kabında, * çocuk ızgaralarında değil * belirtilmelidir. Bu (aksi takdirde çok iyi ve yararlı) cevap, beni "IsSharedScope" özelliği ile karıştırdı. – ForNeVeR

    3

    Bir ListView kullanabilirsiniz

    <ListView ItemsSource="{Binding MyList}"> 
        <ListView.View> 
         <GridView> 
          <GridView.ColumnHeaderContainerStyle> 
           <Style TargetType="{x:Type GridViewColumnHeader}"> 
            <Setter Property="Visibility" Value="Collapsed" /> 
           </Style> 
          </GridView.ColumnHeaderContainerStyle> 
          <GridViewColumn 
           Header="" 
           Width="Auto" 
           DisplayMemberBinding="{Binding Header}"/> 
          <GridViewColumn 
           Header="" 
           DisplayMemberBinding="{Binding Value}"/> 
         </GridView> 
        </ListView.View> 
    </ListView> 
    

    ColumnHeaderContainerStyle GridViewHeader gizler

    +1

    Thankyou, ama sütun kaydırıcılarını veya liste görünümünde mevcut olan seçimi gerçekten istemedim – pastillman

    İlgili konular