首页 > 解决方案 > 在 ListView 之间共享 GroupStyle

问题描述

有没有办法在 ListViews 之间共享 GroupStyle/Columns 的代码。

我的设置适用于一个 ListView,但由于我想要另外两个相同的样式,我不想复制代码,使文件变得混乱。再加上其中一个 ListView 的更改,可能会忘记复制到另一个。

我知道我可以在 Window.Resources 中使用样式,并且我使它适用于列,但是我无法进行分组。

我有从 ObservableCollection > ListCollectionView > ItemsSource 加载的项目,并在 PowerShell 中绑定,就像一个魅力。

适用于一个 ListView 的 Xaml:

<ListView Grid.Row="1" Name="lvAllFiles">
    <ListView.View>
        <GridView>
            <GridViewColumn DisplayMemberBinding="{Binding Name}" Header="Name" Width="1000"/>
            <GridViewColumn DisplayMemberBinding="{Binding Created}" Header="Created" Width="100"/>
            <GridViewColumn DisplayMemberBinding="{Binding LastWriteTime}" Header="LastWriteTime" Width="100"/>
        </GridView>
    </ListView.View>
    <ListView.ItemContainerStyle>
        <Style TargetType="{x:Type ListViewItem}">
            <Setter Property="ToolTip" Value="{Binding TT}"/>
        </Style>
    </ListView.ItemContainerStyle>
    <ListView.GroupStyle>
        <GroupStyle>
            <GroupStyle.ContainerStyle>
                <Style TargetType="{x:Type GroupItem}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <Border BorderBrush="Gray" BorderThickness="1">
                                    <Expander IsExpanded="True">
                                        <Expander.Header>
                                            <TextBlock Text="{Binding Name}" Foreground="Gray" FontSize="14"/>
                                        </Expander.Header>
                                        <ItemsPresenter/>
                                    </Expander>
                                </Border>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </GroupStyle.ContainerStyle>
        </GroupStyle>
    </ListView.GroupStyle>
</ListView>

标签: wpflistviewgroupingwpf-style

解决方案


使用定义GroupStyleas 资源x:Key,例如<Window.Resources>

<Window.Resources>
    <GroupStyle x:Key="gs">
        <GroupStyle.ContainerStyle>
            <Style TargetType="{x:Type GroupItem}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <Border BorderBrush="Gray" BorderThickness="1">
                                <Expander IsExpanded="True">
                                    <Expander.Header>
                                        <TextBlock Text="{Binding Name}" Foreground="Gray" FontSize="14"/>
                                    </Expander.Header>
                                    <ItemsPresenter/>
                                </Expander>
                            </Border>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </GroupStyle.ContainerStyle>
    </GroupStyle>
</Window.Resources>

然后,您可以像这样引用它:

<ListView Grid.Row="1" Name="lvAllFiles">
    ...
    <ListView.GroupStyle>
        <StaticResource ResourceKey="gs" />
    </ListView.GroupStyle>
</ListView>

推荐阅读