格式 Expander.Header 使用内容的属性
Format Expander.Header Using Properties of Content
我有一个列表视图,其 ItemsSource 绑定到 collection 个项目。这些项目使用 Expander 组合在一起。我被要求格式化扩展器的 header 以反映有关内容的一些信息,特别是每个组中是否至少有一个成员 member.IsDirty==true
。我想根据这种情况更改 Foreground
或 IsExpanded
属性,这样即使扩展器折叠(这是首选的默认显示选项),人们也可以在列表中找到他们所做的更改.
以下是使用的 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 并绑定到 Items
和 Items.Count
:
<TextBlock ...>
<TextBlock.Foreground>
<MultiBinding Converter="{StaticResource converter}">
<Binding Path="Items" />
<Binding Path="Items.Count" />
</MultiBinding>
</TextBlock.Foreground>
</TextBlock>
我有一个列表视图,其 ItemsSource 绑定到 collection 个项目。这些项目使用 Expander 组合在一起。我被要求格式化扩展器的 header 以反映有关内容的一些信息,特别是每个组中是否至少有一个成员 member.IsDirty==true
。我想根据这种情况更改 Foreground
或 IsExpanded
属性,这样即使扩展器折叠(这是首选的默认显示选项),人们也可以在列表中找到他们所做的更改.
以下是使用的 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 并绑定到 Items
和 Items.Count
:
<TextBlock ...>
<TextBlock.Foreground>
<MultiBinding Converter="{StaticResource converter}">
<Binding Path="Items" />
<Binding Path="Items.Count" />
</MultiBinding>
</TextBlock.Foreground>
</TextBlock>