将列表列表绑定到ListView并将其分组

时间:2019-09-02 19:24:44

标签: c# wpf

我有一个ListView试图绑定列表列表。

我根据Key对mainList的项目进行了分组。以下是XAML和 将列表绑定到ListView的C#代码。

我按关键字对MainList进行分组。可以正常工作,但是如何将第二个ListView分组为子列表?

这是XAML,是mainList的listView和itemtemplate中子列表的另一个listview:

   <ListView x:Name="MyList" >
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="20" />
                        <RowDefinition  />
                    </Grid.RowDefinitions>
                    <TextBlock Grid.Row="0" Text="{Binding Key}" />
                    <ListView  Grid.Row="1"  ItemsSource="{Binding SubList}">
                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition  />
                                        <ColumnDefinition  />
                                    </Grid.ColumnDefinitions>
                                    <TextBlock Grid.Column="0" Text="{Binding id}" />
                                    <TextBlock Grid.Column="1" Text="{Binding name}" />
                                </Grid>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
        <ListView.GroupStyle>
            <GroupStyle>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate>
                                    <Grid>                                        
                                        <Grid.RowDefinitions>
                                            <RowDefinition Height="auto"/>
                                            <RowDefinition Height="*"/>
                                        </Grid.RowDefinitions>
                                        <StackPanel Margin="10" Orientation="Horizontal">
                                            <Grid>
                                                <Grid.ColumnDefinitions>
                                                    <ColumnDefinition Width="auto"/>
                                                    <ColumnDefinition Width="auto"/>


                                                </Grid.ColumnDefinitions>
                                            </Grid>
                                            <TextBlock Grid.Column="0" Margin="10,0,0,0" Text="Key :" Style="{StaticResource SubHeaderTextBlockStyle}"/>
                                            <TextBlock Grid.Column="1" Margin="10,0,10,0" Text="{Binding Key}" Style="{StaticResource TextBlockStyle}"/>

                                        </StackPanel>
                                        <ItemsPresenter Margin="10" Grid.Row="1" />
                                    </Grid>

                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
        </ListView.GroupStyle>
    </ListView>

这是c#:

  public MainWindow()
        {
            InitializeComponent();
            ObservableCollection<ListObj> MainList1 = new ObservableCollection<ListObj>
            {
                new ListObj
                {
                    Key="key1", Value="value1",
                    SubList=new ObservableCollection<SubListObj>
                    {
                        new SubListObj{id="subid1", name="subname1" },
                        new SubListObj{id="subid2", name="subname2" }
                    }
                },
                new ListObj
                {
                    Key="key2", Value="value2",
                    SubList=new ObservableCollection<SubListObj>
                    {
                        new SubListObj{id="subid3", name="subname3" }
                    }
                }

        };

        MyList.ItemsSource = MainList1;
        CollectionView view = (CollectionView)CollectionViewSource.GetDefaultView(MyList.ItemsSource);
        PropertyGroupDescription gd = new PropertyGroupDescription("Key");
        view.GroupDescriptions.Add(gd);
    }


    public class ListObj
    {
        public string Key { get; set; }
        public string Value { get; set; }
        public ObservableCollection<SubListObj> SubList { get; set; } = new ObservableCollection<SubListObj>();
    }
    public class SubListObj
    {
        public string id { get; set; }
        public string name { get; set; }
    }

1 个答案:

答案 0 :(得分:1)

您必须在XAML中完成所有操作(数据初始化除外)。定义两个CollectionViewSource对象,一个为外部ListView对象,

要设置组标题,请使用GroupStyle.HeaderTemplate(而不是GroupStyle.ContainerStyle):

MainWindow.xaml

<Window>
  <Window.Resources>

    <CollectionViewSource x:Key="MainCollectionViewSource"
                          Source="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=local:SecondWindow}, Path=MainList}">
      <CollectionViewSource.GroupDescriptions>
        <PropertyGroupDescription PropertyName="Key" />
      </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>
  </Window.Resources>

  <ListView ItemsSource="{Binding Source={StaticResource MainCollectionViewSource}}">    
    <ListView.ItemTemplate>
      <DataTemplate DataType="ListObj">

        <Grid>
          <Grid.Resources>

            <CollectionViewSource x:Key="SubCollectionViewSource"
                                  Source="{Binding SubList}">
              <CollectionViewSource.GroupDescriptions>
                <PropertyGroupDescription PropertyName="id" />
              </CollectionViewSource.GroupDescriptions>
            </CollectionViewSource>
          </Grid.Resources>
          <Grid.RowDefinitions>
            <RowDefinition Height="20" />
            <RowDefinition />
          </Grid.RowDefinitions>

          <TextBlock Grid.Row="0"
                     Text="{Binding Value}" />

          <ListView Grid.Row="1"
                    ItemsSource="{Binding Source={StaticResource SubCollectionViewSource}}">
            <ListView.ItemTemplate>
              <DataTemplate DataType="SubListObj">

                <Grid>
                  <TextBlock Text="{Binding name}" />
                </Grid>
              </DataTemplate>
            </ListView.ItemTemplate>
            <ListView.GroupStyle>
              <GroupStyle>
                <GroupStyle.HeaderTemplate>
                  <DataTemplate DataType="GroupItem">
                    <TextBlock FontWeight="Bold"
                               FontSize="14"
                               Text="{Binding Name}" />
                  </DataTemplate>
                </GroupStyle.HeaderTemplate>
              </GroupStyle>
            </ListView.GroupStyle>
          </ListView>
        </Grid>
      </DataTemplate>
    </ListView.ItemTemplate>
    <ListView.GroupStyle>
      <GroupStyle>
        <GroupStyle.HeaderTemplate>
          <DataTemplate DataType="GroupItem">

            <TextBlock FontWeight="Bold"
                       FontSize="14"
                       Text="{Binding Name}" />
          </DataTemplate>
        </GroupStyle.HeaderTemplate>
      </GroupStyle>
    </ListView.GroupStyle>
  </ListView>
</Window>

MainWindow.xaml.cs

public partial class MainWindow : Window
{    
  public ObservableCollection<ListObj> MainList { get; set; }

  public MainWindow()
  {
    InitializeComponent();

    MainList1 = new ObservableCollection<ListObj>
    {
      new ListObj
      {
        Key="key1", Value="value1",
        SubList=new ObservableCollection<SubListObj>
        {
          new SubListObj{id="subid1", name="subname1" },
          new SubListObj{id="subid2", name="subname2" }
        }
      },
      new ListObj
      {
        Key="key2", Value="value2",
        SubList=new ObservableCollection<SubListObj>
        {
          new SubListObj{id="subid3", name="subname3" }
        }
      }    
    };
  }    
}