扩展器标题显示具有特定属性的项目数

时间:2014-01-29 12:36:48

标签: c# wpf expander

我有一个listview,它由基础数据源的属性分组。 Groupstyle包含一个带有标题的扩展器,我想在其中显示各种内容。 列表视图显示了例如按主题分组的电子邮件。 我知道想在每个Group Header中显示(UnreadMailCount / Items)。

到目前为止我的解决方案是:

<ListView Name="Mails" local:FM.Register="{Binding}" local:FM.GetFocus="Loaded"
                  Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
                    ItemsSource="{Binding Path=MailsProxy.View}"
                    SelectionMode="Single"  SelectedItem="{Binding Path=SelectedMail, Mode=TwoWay}"
                    local:SortList.BringIntoViewSelected="True" local:SortList.IsGridSortable="True"
                    ItemContainerStyle="{StaticResource InboxMailItem}"
                    View="{Binding Source={x:Static session:Session.Current}, Path=InboxView.View}">
            <ListView.GroupStyle>
                <GroupStyle>
                    <GroupStyle.ContainerStyle>
                        <Style TargetType="{x:Type GroupItem}">
                            <Setter Property="Margin" Value="0,0,0,5"/>
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="{x:Type GroupItem}">
                                        <Expander Foreground="Black" BorderThickness="0,0,0,1" Style="{StaticResource ExpanderStyle}" Expanded="OnExpand" Collapsed="OnCollapse" Loaded="OnLoad">
                                            <Expander.Header>
                                                <DockPanel>
                                                    <TextBlock FontSize="14" Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListView}, Path=DataContext.GroupBy}"/>
                                                    <TextBlock FontSize="14">:</TextBlock>
                                                    <TextBlock FontSize="14" Text="{Binding Path=Name, Converter={StaticResource GroupHeaderConverter}}" Margin="5,0,0,0"/>
                                                    <TextBlock> </TextBlock>
                                                    <TextBlock FontSize="14" Margin="0,1,0,0">(</TextBlock>
                                                    <TextBlock FontSize="14" Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=ListView}, Path=DataContext.Unread}"/>
                                                    <!--<TextBlock FontSize="14" Text="{Binding StringFormat=0, Converter={StaticResource InboxGroupSeenConverter}}" />-->
                                                    <TextBlock FontSize="14">/</TextBlock>
                                                    <TextBlock FontSize="14" Text="{Binding Path=ItemCount}"/>
                                                    <TextBlock FontSize="14">)</TextBlock>
                                                </DockPanel>
                                            </Expander.Header>
                                                <ItemsPresenter />
                                        </Expander>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </GroupStyle.ContainerStyle>
                </GroupStyle>
            </ListView.GroupStyle>
            <ListView.Resources>
                <Style TargetType="{x:Type GridViewColumnHeader}">
                    <Setter Property="DataContext" Value="{Binding Source={x:Static session:Session.Current}, Path=InboxView}"/>
                </Style>
            </ListView.Resources>
        </ListView>

正如您所看到的,我试图通过使用转换器( - &gt;)来显示未读邮件项目,除了在邮件项目的属性更改后未更新标题时,这是有效的。

转换器:

public class InboxGroupSeenConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return GetTotalUnread(value as CollectionViewGroup);
    }

    private static int GetTotalUnread(CollectionViewGroup group)
    {
        int count = 0;
        foreach (eMail mailItem in group.Items)
            if (mailItem.Seen == false)
                count++;
        return count;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

有没有办法用转换器执行此操作,或者我应该使用如上所示的Properteis以不同的方式()

编辑:澄清我的问题。我的组显示的标题必须显示两个不同的数字。一个是Group的ItemCount,第二个是该组中未读项目的数量。 未读项目的数量是在我的转换器中计算的,这对我来说是一个测试,但是如果基础集合属性发生变化,此解决方案不会更新视图。

1 个答案:

答案 0 :(得分:1)

我认为你的Expander需要DynamicResource Style。 BTW Expander拥有它自己的属性,你可以在这里使用你的解决方案就是我之前回答的问题中的一个例子

WPF-ListView-GridView-allow users...

祝你好运,让我们知道: - )

修改

明天我会回到你身边,因为我很快就会完成工作:-),记住扩展器有它自己的itemsCount所以没有必要实现你自己的,第二件事是在你的电子邮件对象属性中实现{ {1}}而不仅仅是使用DataTriggers将它绑定到文本块样式并且瞧!