2013-07-05 5 views
2

Alors, je l'ai déjà posté une question sur la structure des contrôles imbriqués dans WPF, il est ici: Nested controls structure - in XAML or C#? Et j'ai reçu une solution comme suit:C# WPF gestion des structures imbriquées en utilisant ItemsControl

<ItemsControl ItemsSource="{Binding SomeCollectionOfViewModel}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
     <UniformGrid/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <ItemsControl ItemsSource="{Binding SomeCollection}"> <!-- Nested Content --> 
       ... 
     </DataTemplate> 
    <ItemsControl.ItemTemplate> 
</ItemsControl> 

Je l'ai utilisé cette solution, comming avec ceci:

<!-- The UniformGrids - boxes --> 
<ItemsControl ItemsSource="{Binding UniformGridCollection}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <UniformGrid /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 

     <ItemsControl.ItemTemplate> 
      <DataTemplate> 

       <!-- The TextBoxes - Cells --> 
       <ItemsControl ItemsSource="{Binding TextBoxCollection}"> 
        <ItemsControl.ItemsPanel> 
         <ItemsPanelTemplate> 
          <UniformGrid /> 
         </ItemsPanelTemplate> 
        </ItemsControl.ItemsPanel> 
       </ItemsControl> 

      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 

est ici le côté C#:Mais d'une manière ou d'une autre, les boîtes de texte "Cells", qui sont à l'intérieur des uniformgrids, ne sont pas créées. Au lieu de cela, je reçois seulement 9 grilles uniformes dans une grande grille uniforme (spécifiée dans Paneltemplate). J'ai vérifié l'prgram avec Snoop v 2.8.0: http://i40.tinypic.com/htzo5l.jpg

La question est: Quelqu'un pourrait-il me dire, pourquoi la structure à l'intérieur (de) textboxes arent créé?

+0

Vos collections ne doivent pas être des types d'éléments d'interface utilisateur, mais des types ViewModel. –

+0

Pourriez-vous s'il vous plaît préciser à ce sujet? –

Répondre

4

Vous n'êtes pas définir des TextBox es partout, voilà pourquoi vous n'obtenez des TextBox es dans l'arborescence visuelle:

<Window x:Class="MiscSamples.NestedItemsControls" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="NestedItemsControls" Height="300" Width="300"> 
    <ItemsControl ItemsSource="{Binding Level1}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <UniformGrid/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <ItemsControl ItemsSource="{Binding Level2}"> 
        <ItemsControl.ItemTemplate> 
         <DataTemplate> 
          <TextBox Text="{Binding Value}"/> <!-- You Are missing this! --> 
         </DataTemplate> 
        </ItemsControl.ItemTemplate> 
       </ItemsControl> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</Window> 

En outre, comme mentionné dans le commentaire, vos collections doivent être ViewModel ou types, modèles types non UI:

ViewModels:

public class NestedItemsViewModel 
{ 
    public List<Level1Item> Level1 { get; set; } 
} 

public class Level1Item 
{ 
    public List<Level2Item> Level2 { get; set; } 
} 

public class Level2Item 
{ 
    public string Value { get; set; } 
} 

code Derrière:

public partial class NestedItemsControls : Window 
{ 
    public NestedItemsControls() 
    { 
     InitializeComponent(); 

     DataContext = new NestedItemsViewModel() 
          { 
           Level1 = Enumerable.Range(0, 10) 
               .Select(l1 => new Level1Item() 
                { 
                 Level2 = Enumerable.Range(0, 10) 
                      .Select(l2 => new Level2Item { Value = l1.ToString() + "-" + l2.ToString() }) 
                      .ToList() 
                }) 
                .ToList() 
          }; 
    } 
} 

Notez que vous devrez changer les List s à ObservableCollection s si vous vous attendez ces collections pour modifier dynamiquement lors de l'exécution. Notez également que vous devez implémenter correctement INotifyPropertyChanged.

+0

Merci beaucoup, j'apprécie vraiment votre aide! –

Questions connexes