2015-08-03 1 views
0

Je suit UserControl:comment lier propriété spécifique au contrôle de l'utilisateur dans ItemsControl

<Grid x:Name="LayoutRoot"> 
    <CheckBox x:Name="seat" Margin="2,2,2,2.901" BorderBrush="#FF003FFF" Content="{Binding Path=TypeSSeat, ElementName=UserControl}" /> 
</Grid> 

Avec ce CodeBehind:

[DefaultValue(Nothing)] 
public enum TypeSeat 
{ 
    Nothing,FirstClass, businessclass , economyclass ,NoSeat 
} 
public partial class UCSeat : UserControl 
{ 
    public TypeSeat TypeSSeat 
    { 

     get 
     { 
      return (TypeSeat)GetValue(ItemTextProperty); 
     } 
     set 
     { 
      SetValue(ItemTextProperty, value); 
     } 

    } 
    public static readonly DependencyProperty ItemTextProperty = 
    DependencyProperty.Register("TypeSSeat", typeof(TypeSeat), typeof(UCSeat), new PropertyMetadata(default(TypeSeat))); 

je veux ItemsControl remplir cette usercontrol mais après cours j'ai juste un checkBox.

ceci est mon code windows:

 <ItemsControl Name="icName" Height="366" VerticalAlignment="Top" ItemsSource="{Binding Path=UCSeat}" > 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Grid Margin="0,0,0,5"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="20" /> 
         <ColumnDefinition Width="20" /> 

        </Grid.ColumnDefinitions> 
        <local:UCSeat HorizontalAlignment="Left" Width="156.8" TypeSSeat="{Binding seat1}" ToolTip="1"/> 
        <local:UCSeat HorizontalAlignment="Left" Width="156.8" TypeSSeat="{Binding seat2}" ToolTip="2"/> 

et avec ce code derrière:

  List<SeatList> lst = new List<SeatList>(); 
     lst.Add(new SeatList { seat1 = TypeSeat.FirstClass, seat2 = TypeSeat.FirstClass, seat3 = TypeSeat.NoSeat, seat4 = TypeSeat.FirstClass, seat5 = TypeSeat.FirstClass, seat6 = TypeSeat.Nothing, seat7 = TypeSeat.Nothing, seat8 = TypeSeat.Nothing, seat9 = TypeSeat.Nothing, seat10 = TypeSeat.Nothing, seat11 = TypeSeat.Nothing, seat12 = TypeSeat.Nothing, seat13 = TypeSeat.Nothing, seat14 = TypeSeat.Nothing }); 
     icName.ItemsSource = lst; 

Répondre

2

Votre DataTemplate utilise une grille comme c'est le contrôle de disposition. Les deux UCSeat contrôles utilisateur sont placés dans cette grille sans préciser quelle colonne ils doivent être situés.

Cela signifie sont placés les deux UCSeat contrôles au-dessus de l'autre qui pourrait le faire paraître comme si une seule case à cocher est affichée.

Soit changer la deuxième UCSeat entrée pour inclure la Grid.Column="1" pour faire la deuxième émission de contrôle de l'utilisateur dans la deuxième colonne

OU utiliser un conteneur StackPanel avec Orientation="Horizontal" au lieu du sens du conteneur Grid les deux seront mise en page horizontalement automatiquement

+0

oh mon coup je l'ai oublié. Je vous remercie. –

2

Vous avez tous les éléments là-bas, mais ils sont tous empilés les uns sur les autres.

Pour correctement les éléments mise en page vous devez définir votre ItemsPanelTemplate à tout ce conteneur que vous placez vos articles en (comme un Grid), et utiliser le ItemContainerStyle pour définir les propriétés spécifiques de vos articles (tels que Grid.Row et Grid.Column

Voici quelques échantillons XAML provenant my blog post about the ItemsControl

<ItemsControl ItemsSource="{Binding MyCollection}"> 
    <!-- ItemsPanelTemplate --> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition /> 
        <RowDefinition /> 
        <RowDefinition /> 
       </Grid.RowDefinitions> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition /> 
        <ColumnDefinition /> 
        <ColumnDefinition /> 
       </Grid.ColumnDefinitions> 
      </Grid> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 

    <!-- ItemContainerStyle --> 
    <ItemsControl.ItemContainerStyle> 
     <Style> 
      <Setter Property="Grid.Column" 
        Value="{Binding ColumnIndex}" /> 
      <Setter Property="Grid.Row" 
        Value="{Binding RowIndex}" /> 
     </Style> 
    </ItemsControl.ItemContainerStyle> 

    <!-- ItemTemplate --> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Button Content="{Binding Name}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

cela suppose que vous liez à une collection d'objets qui ressemblent à ceci:

public class MyObjectModel 
{ 
    public string Name { get; set; } 
    public int ColumnIndex{ get; set; } 
    public int RowIndex{ get; set; } 
} 

et les résultats dans quelque chose comme ceci:

enter image description here

Je recommande vivement la lecture de la post réelle aussi bien si vous êtes nouveau à l'aide d'un ItemsControl :)