WPF - Как создать ListView с различными стилями группы - PullRequest
1 голос
/ 18 октября 2010

У меня есть набор данных, которые я хотел бы представить через 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

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

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

Ответы [ 3 ]

2 голосов
/ 17 декабря 2010

Вот как я решил эту проблему:

  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 голосов
/ 12 ноября 2010

используйте DataTrigger в свойстве Name группы collectionview, которое является текстовым контентом группового элемента

0 голосов
/ 19 октября 2010

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

  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>
// ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...