格式 Expander.Header 使用内容的属性

Format Expander.Header Using Properties of Content

我有一个列表视图,其 ItemsSource 绑定到 collection 个项目。这些项目使用 Expander 组合在一起。我被要求格式化扩展器的 header 以反映有关内容的一些信息,特别是每个组中是否至少有一个成员 member.IsDirty==true。我想根据这种情况更改 ForegroundIsExpanded 属性,这样即使扩展器折叠(这是首选的默认显示选项),人们也可以在列表中找到他们所做的更改.

以下是使用的 windows 资源:

    <DataTemplate DataType="{x:Type vm:OverViewModel}" x:Key="OV_DT" x:Name="OV_DT">
        <control:OverView Width="{Binding ActualWidth,ElementName=ListWidth}"/>
    </DataTemplate>
    <CollectionViewSource x:Key="SortedOverViews" Source="{Binding OverViews}">
        <CollectionViewSource.SortDescriptions>
            <scm:SortDescription PropertyName="ParentName"/>
        </CollectionViewSource.SortDescriptions>
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="ParentName"/>
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>

列表视图本身如下所示:

<ListView ItemsSource="{Binding Source={StaticResource SortedOverViews}}"
            ItemTemplate="{StaticResource OV_DT}">
    <ListView.GroupStyle>
        <GroupStyle>
            <GroupStyle.ContainerStyle>
                <Style TargetType="{x:Type GroupItem}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type GroupItem}">
                                <Expander IsExpanded="{Binding DataContext.Overviews_IsExpanded,RelativeSource={RelativeSource AncestorType=Window},Mode=OneTime}">
                                    <Expander.Header>
                                        <StackPanel Orientation="Horizontal">
                                            <TextBlock Text="{Binding Path=Items[0].TargetOverView.Goods_Name}"
                                                       Foreground="{Binding Path=Items[0].Is_Intermediate,Converter={StaticResource boolColour}}"/>
                                        </StackPanel>
                                    </Expander.Header>
                                    <Expander.Content>
                                        <ItemsPresenter/>
                                    </Expander.Content>
                                </Expander>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </GroupStyle.ContainerStyle>
        </GroupStyle>
    </ListView.GroupStyle>
</ListView>

我想了一会儿,我需要以某种方式将 collection 组的内容作为 collection 传递给转换器,返回类似 myCollection.Where(x=>x.IsDirty).Any() 的内容,但我不能找出如何做到这一点,现在我不知道是否可以通过这种方式访问​​每个组的内容来制作 collection.

如有任何指导,将不胜感激!我花了相当多的时间在网上查看 Expander 和 ListView 教程,但它们只涵盖了更简单的示例,例如我已经实现的。

您可以像这样绑定到 Items

Foreground="{Binding Items, Converter={StaticResource converter}}

转换器:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) =>
    value is ReadOnlyObservableCollection<object> items
        && items.OfType<YourClass>()?.Any(x => x.IsDirty) == true;

The converter works perfectly when given a full collection, however, when the listview is first populated, the binding only evaluates a single item in each group

您可以使用 MultiValueConverter 并绑定到 ItemsItems.Count:

<TextBlock ...>
    <TextBlock.Foreground>
        <MultiBinding Converter="{StaticResource converter}">
            <Binding Path="Items" />
            <Binding Path="Items.Count" />
        </MultiBinding>
    </TextBlock.Foreground>
</TextBlock>