WPF ListView / Gridview允许用户选择多个项目并将它们组合在一起

时间:2013-12-17 05:52:29

标签: wpf listview gridview grouping

我在MVVM应用程序中有一个WPF ListView / GridViwe。 GridView绑定到ViewModel中的List。

要求是用户应该能够选择gridview的多行,右键单击它并查看上下文菜单“Group These Together”。选择后,所有这些项目应折叠为一个组,并在开头添加扩展器或+符号。

有人可以帮我帮忙吗?

2 个答案:

答案 0 :(得分:1)

我正在研究类似的问题,但我不得不按照他们说出的名字对项目进行分组。我所做的是创建DataTriggerMultiDataTrigger,具体取决于您的数据要求,然后当条件为真时,即选择的项目更改GroupItem的容器。我的意思是,当您创建列表视图时,您必须使用分组视图创建它,btw没有分组,因为您可以在没有expander的情况下声明它并只使用StackPanel。之后,您需要3行代码来设置分组。这是一个例子: MAIN.xaml

<ListView 
                ScrollViewer.CanContentScroll="False" 
                x:Name="lsvProducts" 
                ItemsSource="{Binding Products, NotifyOnSourceUpdated=True}" 
                MouseDown="lsvProducts_MouseDown">
                <ListView.View>
                    <GridView>
                        <GridViewColumn Width="Auto" Header="Code" DisplayMemberBinding="{Binding ID}"/>
                        <GridViewColumn Width="Auto" Header="Description" DisplayMemberBinding="{Binding Desc}"></GridViewColumn>
                        <GridViewColumn Width="Auto" Header="Qty" DisplayMemberBinding="{Binding Qty}"></GridViewColumn>
              </GridView>
                </ListView.View>
                <ListView.GroupStyle>
                    <GroupStyle ContainerStyle="{StaticResource GroupedView}"/>
                </ListView.GroupStyle>
            </ListView>

正如您所看到的,我已经为分组样式声明了一个空容器,因为您没有事先声明就无法分配它。在此声明之后,您需要在generic.xaml

中进行此操作
<Style x:Key="GroupedView" TargetType="{x:Type GroupItem}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding ElementName=chbx, Path=IsChecked}" Value="True">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <Expander IsExpanded="False">
                                <Expander.Header>
                                    <StackPanel Orientation="Horizontal">
                                        <TextBlock Text="{Binding Name}" FontWeight="Bold" Foreground="Gray" FontSize="22" VerticalAlignment="Bottom" />
                                        <TextBlock Text="{Binding ItemCount}" FontSize="16" Foreground="DimGray" FontWeight="Bold" FontStyle="Italic" Margin="10,0,0,0" VerticalAlignment="Bottom" />
                                        <TextBlock Text=" item(s)" FontSize="16" Foreground="Silver" FontStyle="Italic" VerticalAlignment="Bottom" />
                                    </StackPanel>
                                </Expander.Header>
                                <ItemsPresenter />
                            </Expander>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </DataTrigger>

在声明了真实值的样式后,您需要在没有expander

的情况下声明样式
<!--This goes in the same style as the prevoius sample code -->
    <DataTrigger Binding="{Binding ElementName=chbx, Path=IsChecked}" Value="False">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <StackPanel>
                                    <ItemsPresenter />
                                </StackPanel>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>

下一步是定义分组:

//lsvProducts is our ListView
view = (CollectionView) CollectionViewSource.GetDefaultView(lsvProducts.ItemsSource);
//in the creation parameter you should put field that you want to group by :-)
PropertyGroupDescription grouping = new PropertyGroupDescription("FieldToGroupBy");
view.GroupDescriptions.Add(grouping);

哪个应该适用于ViewModel。 祝好运! 如果您需要更多帮助,请告诉我们,我会尽力使用我的英语; - )

修改

我忘了提到你分配分组时需要检查已经在集合中的组数,只有当有非0或0时才应用它,否则你将多次应用分组并且扩展器将被重复在结果窗口中添加分组的次数: - )

答案 1 :(得分:0)

在我的脑海中选择多行Ctrl +单击

它将选择多行,并在将其Isopen设置为true

后右键单击打开上下文菜单

您还应该将所选项目绑定到列表并使用此项目制作扩展程序