2013-03-21 7 views
0

У меня есть ObservableCollection с элементами, которые я хочу отобразить в ListBox. Также я пишу шаблон для ListboxItem для правильного отображения моей коллекции. На этом этапе все работает нормально.WPF Элементы ListBox с шаблоном становятся невидимыми после группировки

в .cs

Sensors = new ObservableCollection<Sensor>(); 
... 
lstBox.ItemsSource = Sensors; 

в .xaml

... 
<DataTemplate x:Key="SensorTileTemplate"> 
      <Border> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="*"></RowDefinition> 
         <RowDefinition Height="*"></RowDefinition> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="70"></ColumnDefinition> 
         <ColumnDefinition Width="*"></ColumnDefinition> 
         <ColumnDefinition Width="*"></ColumnDefinition> 
        </Grid.ColumnDefinitions> 

        <TextBlock Text="{Binding Name}" Grid.Row="0" Grid.ColumnSpan="3"></TextBlock> 
        <Image Source="{Binding ImageModel.ImgSource}" Style="{StaticResource ImageGlowStyle}" Height="72" Grid.Row="1" Grid.Column="0"></Image> 
        <StackPanel Grid.Row="1" Grid.Column="1" Margin="5"> 
         <TextBlock Text="IP:"></TextBlock> 
         <TextBlock Text="Port:"></TextBlock> 
         <TextBlock Text="Command port:"></TextBlock> 
        </StackPanel> 
        <StackPanel Grid.Row="1" Grid.Column="2" Margin="5"> 
         <TextBlock Text="{Binding DeviceAddress}"></TextBlock> 
         <TextBlock Text="{Binding DeviceDataPort}"></TextBlock> 
         <TextBlock Text="{Binding DeviceControlPort}"></TextBlock> 
        </StackPanel> 
       </Grid> 
      </Border> 
     </DataTemplate> 

<Style x:Key="ContainerStyle"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding IsSelected}" Value="True"> 
        <Setter Property="ListBoxItem.Visibility" Value="Collapsed"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 

... 

<ListBox Name="lstBox" Focusable="False" 
          SelectionChanged="lstBox_SelectionChanged" 
          HorizontalContentAlignment="Stretch" 
          ItemTemplate="{StaticResource SensorTileTemplate}" 
          ItemContainerStyle="{StaticResource ContainerStyle}"> 
       </ListBox> 

Проблема возникает, когда мне нужно сгруппировать некоторые элементы с помощью расширителя как групповой контейнер.

в .cs

... 
ICollectionView view = CollectionViewSource.GetDefaultView(Sensors); 
view.GroupDescriptions.Add(new PropertyGroupDescription("GroupNumber")); 

lstBox.ItemsSource = view; 
... 

в .xaml

<!--Same Template and Style--> 
... 
... 
<Style x:Key="GroupContainerStyle" TargetType="{x:Type GroupItem}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type GroupItem}"> 
         <Expander IsExpanded="True">   
          <Expander.Header> 
           <StackPanel Orientation="Horizontal"> 
            <TextBlock Text="Group #" /> 
            <TextBlock Text="{Binding Name}" /> 
           </StackPanel> 
          </Expander.Header> 
          <Expander.Content> 
           <ItemsPresenter /> 
          </Expander.Content> 
         </Expander> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
... 
<ListBox Name="lstBox" Focusable="False" 
          SelectionChanged="lstBox_SelectionChanged" 
          HorizontalContentAlignment="Stretch" 
          ItemTemplate="{StaticResource SensorTileTemplate}" 
          ItemContainerStyle="{StaticResource ContainerStyle}"> 
        <ListBox.GroupStyle> 
         <GroupStyle ContainerStyle="{StaticResource GroupContainerStyle}" /> 
        </ListBox.GroupStyle> 
       </ListBox> 

Этот код работает и группирует предметы, но предметы становятся невидимыми.
Таким образом, без группировки элементов отображается правильно, но с группировкой расширители ничего не показывают в нем.
Я думаю, что есть что-то около ItemsPresenter в Expander, но не могу понять, что.

ответ

1

Проблема была в одной третьей теме, которую я использую в своем приложении. Эта тема имеет ListBox шаблон, как:

<Style TargetType="{x:Type ListBox}"> 
... 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type ListBox}"> 
        <Grid> 
         <Border x:Name="Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="2" Background="{DynamicResource ControlBackgroundBrush}" /> 
         <ScrollViewer Margin="1" Style="{DynamicResource NuclearScrollViewer}" Focusable="false" Background="{x:Null}"> 
          <StackPanel Margin="1,1,1,1" IsItemsHost="true" /> 
         </ScrollViewer> 
        </Grid> 
        <ControlTemplate.Triggers> 
         <Trigger Property="IsEnabled" Value="false"> 
          <Setter Property="Background" Value="{DynamicResource DisabledBackgroundBrush}" TargetName="Border" /> 
          <Setter Property="BorderBrush" Value="{DynamicResource DisabledBorderBrush}" TargetName="Border" /> 
         </Trigger> 
         <Trigger Property="IsGrouping" Value="true"> 
          <Setter Property="ScrollViewer.CanContentScroll" Value="false" /> 
         </Trigger> 
        </ControlTemplate.Triggers> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

Так я использую ItemsPresenter вместо StackPanel в этом шаблоне, и все теперь работает.

 Смежные вопросы

  • Нет связанных вопросов^_^