【问题标题】:WPF: How to split Listview columns into sub-columnsWPF:如何将 Listview 列拆分为子列
【发布时间】:2015-04-17 07:25:08
【问题描述】:

我是 WPF 新手。我正在尝试制作Listview 表。我想拆分一些列。例如:

   parent column1      |        parent column2   
column1.1 | column 1.2 | column2.1 | column 2.2 |column 2.3 

我在这里发现了一个类似的问题:WPF: Spilt GridView header into two rows where the bottom row is seperated into two colums 但那里的答案对我不起作用。我无法发表评论并要求进一步解释,因为我没有足够的声誉发表评论。当我做同样的事情时,在我的情况下,列显示正常,但它们充当一列。子列不起作用。 这是我的代码示例:

<ListView Margin="20" Name="purchaseSummaryList" ItemsSource="{Binding purchaseSummaryCol, Mode=Default}"> 
  <ListView.View>
    <GridView>
      <GridView.Columns>
        //single example that works fine
        <GridViewColumn Header="ID" Width="100"  DisplayMemberBinding="{Binding id, Mode=Default}" /> //single example that works
        //parent column that acts as one column
        <GridViewColumn Width="300" DisplayMemberBinding="{Binding pay, Mode=Default}">
          <GridViewColumnHeader>
            <Grid HorizontalAlignment="Center" VerticalAlignment="Center">
              <Grid VerticalAlignment="Center" ShowGridLines="False" Width="300">
                <Grid.RowDefinitions>
                  <RowDefinition Height="*"/>
                  <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <TextBlock Grid.Row="0" HorizontalAlignment="Center" Text="PARENT"/>
                <Grid Grid.Row="1">
                  <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="*"/>
                  </Grid.ColumnDefinitions>
                  <TextBlock Grid.Column="0" HorizontalAlignment="Center" Padding="5" Text="Child1" />
                  <TextBlock Grid.Column="1" HorizontalAlignment="Center" Padding="5" Text="Child2"/>
                  <TextBlock Grid.Column="2" HorizontalAlignment="Center" Padding="5" Text="Child3"/>
                </Grid>
              </Grid>
            </Grid>
          </GridViewColumnHeader>
        </GridViewColumn>
      <GridView.Columns>
    <GridView>
  <ListView.View>
<ListView>

我知道很明显只有一列是父列,因为我没有将任何内容绑定到子列。但问题是,我做不到。它不允许我将DisplayMemberBinding 用于儿童TextBlock。我也不能在Grid 中添加新的GridViewColumn。我不知道如何建模。

有人可以帮我解决这个问题吗?我也希望有一个好的 WPF 教程链接我可以在哪里学习。谢谢。

【问题讨论】:

    标签: c# wpf listview split multiple-columns


    【解决方案1】:

    这可能是您正在寻找的东西吗?

    ListViewItem parent1 = new ListViewItem("Parent1");
    parent1.SubItems.Add("ChildItem");
    parent1.SubItems.Add("ChildItem");
    parent1.SubItems.Add("ChildItem");
    
    ListViewItem parent2 = new ListViewItem("Parent2");
    parent2.SubItems.Add("ChildItem");
    parent2.SubItems.Add("ChildItem");
    parent2.SubItems.Add("ChildItem");
    
    ListViewItem parent3 = new ListViewItem("Parent3");
    parent3.SubItems.Add("ChildItem");
    parent3.SubItems.Add("ChildItem");
    parent3.SubItems.Add("ChildItem");
    
    ListViewXY.Items.AddRange(new ListViewItem[] {parent1 ,parent2 ,parent3 });
    

    【讨论】:

    • ListViewItem 充当 veritcal list 中的项目,对吗?我可以将它们用作列吗?据我了解,这将显示一个树列表。我错了吗?
    • 是的,这应该会显示一个树状列表。列将是 ListViewXY.Columns.Add(text, width, alignment);
    • 我不确定,但也许这个会有所帮助:csharp.net-informations.com/gui/cs-listview.htm
    • 感谢您的帮助。我去看看。
    【解决方案2】:

    它需要更多的工作,特别是关于我没有尝试过的值的绑定,但这适用于标题:

    <ListView ItemsSource="{Binding PurchaseSummaryCol}" IsSynchronizedWithCurrentItem="True">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="ID" Width="100"  DisplayMemberBinding="{Binding Id}"/>                    
                <GridViewColumn Header="PARENT" Width="300" DisplayMemberBinding="{Binding Pay}" HeaderTemplate="{StaticResource MultiColumnHeaderTemplate}"
                                CellTemplate="{StaticResource MultiColumnCellTemplate}" />
            </GridView>
        </ListView.View>
    </ListView>
    

    那么你需要同时拥有header和cell模板的资源:

    <DataTemplate x:Key="MultiColumnHeaderTemplate">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="Auto" />
                >RowDefinition Height="Auto" />
            </Grid.RowDefinitions>
            <TextBlock Grid.Row="0" Text="{Binding}" HorizontalAlignment="Center"/>
            <GridViewHeaderRowPresenter HorizontalAlignment="Stretch" Grid.Row="1" Columns="{StaticResource SubColumnCollection}"/>      
        </Grid>
    </DataTemplate>
    
    <DataTemplate x:Key="MultiColumnCellTemplate">
        <Grid>
            <GridViewRowPresenter HorizontalAlignment="Stretch" Columns="{DynamicResource SubColumnCollection}"/>
        </Grid>
    </DataTemplate>
    

    现在只剩下定义子列表集合了:

    <GridViewColumnCollection x:Key="SubColumnCollection">
        <GridViewColumn Header="Child1" Width="100" DisplayMemberBinding="{Binding Child1}"/>
        <GridViewColumn Header="Child2" Width="100" DisplayMemberBinding="{Binding Child2}"/>
        <GridViewColumn Header="Child3" Width="100" DisplayMemberBinding="{Binding Child3}"/>
    </GridViewColumnCollection>
    

    我没有调查,但孩子的绑定没有显示,除了它有效。

    PS:Microsoft 建议对属性使用 CamelCasing。

    【讨论】:

    • 谢谢你的朋友,现在有你说的三列。但他们仍然表现得像一个人。我想,我不应该将任何内容绑定到父列,因为它将该绑定用作一列。另外我想,我应该以某种方式在子列和父级之间建立关于绑定的联系。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-28
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多