2011-01-15 4 views
4

Ich habe eine Listbox, die die Elemente mit einem GroupStyle gruppiert. Ich möchte ein Steuerelement am unteren Rand des Stackpanels hinzufügen, das alle Gruppen enthält. Dieses zusätzliche Steuerelement muss Teil des Bildlauf-Inhalts sein, damit der Benutzer zum Ende der Liste blättern kann, um das Steuerelement anzuzeigen. Wenn ich eine Listbox ohne die Gruppen verwende, wäre diese Aufgabe einfach, indem ich die ListBox-Vorlage modifiziere. Bei den gruppierten Elementen scheint die ListBox-Vorlage jedoch nur für jede Gruppe zu gelten. Ich kann das GroupStyle.Panel ändern, aber das erlaubt mir nicht, Elemente zu diesem Panel hinzuzufügen.Gruppenfeld von WPF ListBox

<ListBox> 
<ListBox.ItemsPanel> 
    <ItemsPanelTemplate> 
     <WrapPanel/> 
    </ItemsPanelTemplate> 
</ListBox.ItemsPanel> 
<ListBox.GroupStyle> 
    <GroupStyle> 
     <GroupStyle.Panel> 
      <ItemsPanelTemplate> 
       <VirtualizingStackPanel/> **<----- I would like to add a control to this stackpanel** 
      </ItemsPanelTemplate> 
     </GroupStyle.Panel> 
     <GroupStyle.ContainerStyle> 
      <Style TargetType="{x:Type GroupItem}"> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="{x:Type GroupItem}"> 
           <Grid> 
            <ItemsPresenter /> 
           </Grid> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </GroupStyle.ContainerStyle> 
    </GroupStyle> 
</ListBox.GroupStyle> 

Dies sollte eine Vorstellung davon, was ich tun muss:

GroupStyleNeeds

+0

Zeichnen Sie ein Bild, was Sie genau wollen. Weil ich denke, dass Sie Ihr Steuerelement nach ListBox hinzufügen und die Vorlage nicht ändern können. – vorrtex

Antwort

8

Sie können die Strategie verwenden Sie einen ListBox planten, tun es nur für ein GroupItem stattdessen. Wenn Sie diese XAML zu Ihrem GroupStyle hinzufügen, es wird eine End-of-Gruppe hinzufügen TextBlock:

<GroupStyle.ContainerStyle> 
    <Style TargetType="GroupItem"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type GroupItem}"> 
        <StackPanel> 
         <ContentPresenter/> 
         <ItemsPresenter Margin="5,0,0,0"/> 
         <TextBlock Text="*** End of group ***"/> 
        </StackPanel> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</GroupStyle.ContainerStyle> 

Edit:

Dies ist das komplette XAML-einziges Beispiel einer gruppierten Liste mit einer Scrollbar und zusätzlicher Inhalt am Ende des Bildlaufbereichs hinzugefügt:

<Grid Height="100"> 
    <Grid.Resources> 
     <PointCollection x:Key="sampleData"> 
      <Point X="1" Y="1"/> 
      <Point X="1" Y="2"/> 
      <Point X="2" Y="3"/> 
      <Point X="2" Y="4"/> 
      <Point X="3" Y="5"/> 
      <Point X="3" Y="6"/> 
     </PointCollection> 
     <CollectionViewSource x:Key="groupedSampleData" Source="{StaticResource sampleData}"> 
      <CollectionViewSource.GroupDescriptions> 
       <PropertyGroupDescription PropertyName="X" /> 
      </CollectionViewSource.GroupDescriptions> 
     </CollectionViewSource> 
    </Grid.Resources> 
    <ListBox ItemsSource="{Binding Source={StaticResource groupedSampleData}}"> 
     <ListBox.Template> 
      <ControlTemplate TargetType="{x:Type ListBox}"> 
       <ScrollViewer CanContentScroll="True"> 
        <StackPanel> 
         <ItemsPresenter/> 
         <TextBlock Text="*** End of list ***"/> 
        </StackPanel> 
       </ScrollViewer> 
      </ControlTemplate> 
     </ListBox.Template> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Path=Y}"/> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <WrapPanel/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <ItemsControl.GroupStyle> 
      <GroupStyle> 
       <GroupStyle.Panel> 
        <ItemsPanelTemplate> 
         <VirtualizingStackPanel/> 
        </ItemsPanelTemplate> 
       </GroupStyle.Panel> 
       <GroupStyle.HeaderTemplate> 
        <DataTemplate> 
         <TextBlock Margin="4" FontWeight="Bold" FontSize="15" Text="{Binding Path=Name}"/> 
        </DataTemplate> 
       </GroupStyle.HeaderTemplate> 
      </GroupStyle> 
     </ItemsControl.GroupStyle> 
    </ListBox> 
</Grid> 
+0

Vielen Dank für den Vorschlag. Das Problem ist, dass der Textblock jeder Gruppe hinzugefügt wird. Ich brauche etwas am Ende aller Gruppen. – rulestein

+0

In diesem Fall würde ich Ihre ursprüngliche Schlussfolgerung sagen, dass das Ändern der "ListBox" Vorlage betroffenen Gruppen falsch ist. ** Something ** muss die Gruppen enthalten und nicht "GroupItem". Ich werde ein komplettes Beispiel veröffentlichen. –

+0

Vielen Dank für das vollständige Beispiel. Ich bin mir nicht sicher, warum die Listbox-Vorlage für mich nicht funktionierte, als ich damit herumhantierte, aber Ihr Beispiel ist, was ich brauchte. – rulestein