2010-10-18 1 views
0

У меня есть набор данных, которые я хотел бы представить с помощью WPF ListView таким образом:WPF - Как сделать ListView с различными стилями группы

 
Column1 Column2 Column3 
--GroupName1-- 
Item1  part2  part3 
Item2  part2  part3 
--GroupName2-- 
Item3  part2  part3 
Item4  long_text_in_both_columns 
Item5  part2  part3 
--GroupName1-- 
Item6  part2  part3 
Item7  long_text_in_both_columns 
--GroupName3-- 
Item8  part2  part3 

Я хотел бы, чтобы цвет группы так что каждое имя группы имеет соответствующий цвет. Обратите внимание, что в приведенном выше списке есть два экземпляра «GroupName1», и оба должны быть одного цвета. Я начинаю с работы с этим базовым образцом: http://msdn.microsoft.com/en-us/library/ms771309(VS.90).aspx

В частности:
-Как могу я иметь две группы с тем же именем, но разные предметы? (Возможно, что-то вроде скрытого «идентификатора группы», который отличается от отображаемого «имени группы»?)
-Как можно стилить каждую группу по имени?

(Обратите внимание, что все элементы всегда отображаются в порядке, и параметры, отличные от групп будет тоже хорошо.)

ответ

1

Вот как я в конечном итоге решить это:

  1. Как я сначала подумал, что дает каждому элемент как GroupID, так и GroupName проработал довольно хорошо. Идентификаторы остается уникальным, но группы были представлены как:

    <ListView.GroupStyle> 
         <GroupStyle> 
          <GroupStyle.ContainerStyle> 
           <Style TargetType="{x:Type GroupItem}"> 
            <Setter Property="Margin" Value="1,1,1,10"/> 
            <Setter Property="Template"> 
             <Setter.Value> 
              <ControlTemplate TargetType="{x:Type GroupItem}"> 
               <Grid> 
                <Rectangle Grid.ColumnSpan="4" Margin="0,0,0,0" Fill="{Binding Path=Items[0].GroupBackground}" Stroke="#FF808080" RadiusX="6" RadiusY="6" /> 
                <Expander IsExpanded="True"> 
                 <Expander.Header> 
                  <DockPanel> 
                   <TextBlock FontSize="14" Text="{Binding Path=Items[0].GroupName}" Margin="5,0,0,0" HorizontalAlignment="Stretch"/> 
                  </DockPanel> 
                 </Expander.Header> 
                 <Expander.Content> 
                  <ItemsPresenter /> 
                 </Expander.Content> 
                </Expander> 
               </Grid> 
              </ControlTemplate> 
             </Setter.Value> 
            </Setter> 
           </Style> 
          </GroupStyle.ContainerStyle> 
         </GroupStyle> 
        </ListView.GroupStyle> 
    
  2. Я обнаружил, что единственный стиль мне действительно нужно делать на группе был общий цвет фона. Я создал другое свойство для элементов, используемых группой. Я к нему доступ с:

    Fill="{Binding Path=Items[0].GroupBackground}" 
    

, возможно, не самый лучший подход (много дублирования данных Groupname и GroupBackground), но он работал на меня.

0

Ваш вопрос расплывчатый, но я буду стараться изо всех сил, чтобы ответить на них.

  1. Как я могу создать две группы с одинаковыми именами, но разные элементы? (Возможно, что-то вроде скрытого «идентификатора группы», который отличается от отображаемого «имени группы»?)

Как вы определили, что элементы в каждой группе принадлежат в первую очередь? В примере «1-й группы», они всегда будут находиться в одной и той же группе, если вы решили сгруппировать элементы по определенному описанию группы (ваш пример использует «GroupName»)

  1. Как укладывать каждую группу по имя?

Стили группировки могут быть определены следующим образом.

<Style TargetType="{x:Type GroupItem}" > 
    <Setter Property="Template" > 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type GroupItem}" > 
       <GroupBox Header="{Binding Name}" /> 
        // define style here... 
       </GroupBox > 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

// ... 
<ListView.GroupStyle> 
    <GroupStyle /> 
</ListView.GroupStyle> 
// ... 
+0

1. Да, я знаю, какие элементы принадлежат к группам, они просто должны отображаться в порядке, указанном с отображаемыми именами. Иногда отображаемые имена идентичны. – PeteVasi

+0

2. Я понимаю, как стиль группы, но я хочу, чтобы каждая другая группа (по отображаемому имени) имела другой стиль. Один стиль для группы отображения. – PeteVasi

0

Используйте DataTrigger на имя имущества collectionviewgroup который является DataContext в groupitem

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