wpf 列表框为列提供标题

wpf Listbox giving columns a header

提问人:bilpor 提问时间:9/8/2015 最后编辑:IAbstractbilpor 更新时间:9/1/2021 访问量:41145

问:

我有以下标记(xaml):

<ListBox Name="lbEurInsuredType" HorizontalContentAlignment="Stretch">
            <ListBox.ItemTemplate>
               <DataTemplate>
                    <Grid Margin="0,2">
                        <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"></ColumnDefinition>
                            <ColumnDefinition Width="30"></ColumnDefinition><ColumnDefinition Width="2"></ColumnDefinition>
                            <ColumnDefinition Width="30"></ColumnDefinition>
                   </Grid.ColumnDefinitions>
                   <TextBlock Text="{Binding Title}"></TextBlock>
                   <TextBox Text="{Binding Uw}" Grid.Column="1"></TextBox>
                   <TextBox Text="{Binding Partner}" Grid.Column="3"></TextBox>
                </Grid>
            </DataTemplate></ListBox.ItemTemplate>

        </ListBox>

这一切看起来都不错,但现在在第 1 列和第 3 列上方我想放置一个标题。谁能告诉我如何为我的两列添加标题。

C# WPF XAML 列表框

评论


答:

-1赞 Mohit S 9/8/2015 #1

我没有运行这个,所以代码可能存在一些问题,但这会让你想到向 ListBox 添加标头

<ListBox Name="lbEurInsuredType" HorizontalContentAlignment="Stretch">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid Margin="0,2">
                <Grid.RowDefinitions>
                    <RowDefinition  />
                    <RowDefinition  />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="100"></ColumnDefinition>
                    <ColumnDefinition Width="30"></ColumnDefinition>
                    <ColumnDefinition Width="2"></ColumnDefinition>
                    <ColumnDefinition Width="30"></ColumnDefinition>
                </Grid.ColumnDefinitions>

                <TextBlock Text="Title" ></TextBlock>
                <TextBlock Text="Uw" Grid.Column="1" ></TextBox>
                <TextBlock Text="Partner" Grid.Column="3" ></TextBox>

                <TextBlock Text="{Binding Title}" Grid.Row="1"></TextBlock>
                <TextBox Text="{Binding Uw}" Grid.Column="1" Grid.Row="1"></TextBox>
                <TextBox Text="{Binding Partner}" Grid.Column="3" Grid.Row="1"></TextBox>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

评论

0赞 bilpor 9/8/2015
我已经尝试过了,除了从文本框更改为标签之外,但没有任何显示。
0赞 Umar 9/19/2023
不值得一试。标题将与列表框中的每个项目一起显示。这只是在这里浪费精力。
5赞 SamTh3D3v 9/8/2015 #2

我建议你使用更适合你的情况,你可以使用内部并定义你需要的列,然后更容易地重新设置它们的样式ListViewGridView

 <ListView Name="lbEurInsuredType" HorizontalContentAlignment="Stretch" ItemsSource="{Binding Items}">
        <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Title}"></TextBlock>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                        <GridViewColumn.Header>
                            <TextBlock Text="Column 1"></TextBlock>
                        </GridViewColumn.Header>
                    </GridViewColumn>
                    <GridViewColumn>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Uw}"></TextBlock>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>                           
                    </GridViewColumn>
                    <GridViewColumn>
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <TextBlock Text="{Binding Partner}"></TextBlock>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                        <GridViewColumn.Header>
                            <TextBlock Text="Column 3"></TextBlock>
                        </GridViewColumn.Header>
                    </GridViewColumn>
                </GridView.Columns>
            </GridView>
        </ListView.View>                      
    </ListView>

评论

0赞 bilpor 9/8/2015
我不能使用视图,因为我需要使用文本框,以便用户可以更改一些默认值。
0赞 SamTh3D3v 9/8/2015
我看不出问题出在哪里?
0赞 bilpor 9/8/2015
在您的示例中,您已将我的文本框更改为 TextBlock。我假设这是因为它是一个ListView(我是wpf的新手)。但我需要允许用户更改数据。我使用了 Mattia 的答案,似乎有效。
1赞 SamTh3D3v 9/8/2015
不,我不是故意改变的,我没有注意到你正在使用 textBoxs,仅此而已,你可以使用 textBoxs 并很好地编辑作品
20赞 Mattia Magosso 9/8/2015 #3

Listview 无疑是最好的选择,但是,如果您需要使用列表框,则可以以这种方式修改列表框的模板。

   <ListBox Name="lbEurInsuredType" HorizontalContentAlignment="Stretch">
        <ListBox.Template>
            <ControlTemplate>
                <DockPanel LastChildFill="True">
                    <Grid DockPanel.Dock="Top" Height="30">
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="100"></ColumnDefinition>
                            <ColumnDefinition Width="30"></ColumnDefinition>
                            <ColumnDefinition Width="2"></ColumnDefinition>
                            <ColumnDefinition Width="30"></ColumnDefinition>
                        </Grid.ColumnDefinitions>
                        <Label Grid.Column="0">Column 1</Label>
                        <Label Grid.Column="1">Column 2</Label>
                        <Label Grid.Column="2">Column 3</Label>
                        <Label Grid.Column="3">Column 4</Label>
                    </Grid>
                    <ItemsPresenter></ItemsPresenter>
                </DockPanel>
            </ControlTemplate>
        </ListBox.Template>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Grid Margin="0,2">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="100"></ColumnDefinition>
                        <ColumnDefinition Width="30"></ColumnDefinition>
                        <ColumnDefinition Width="2"></ColumnDefinition>
                        <ColumnDefinition Width="30"></ColumnDefinition>
                    </Grid.ColumnDefinitions>
                    <TextBlock Text="{Binding Title}"></TextBlock>
                    <TextBox Text="{Binding Uw}" Grid.Column="1"></TextBox>
                    <TextBox Text="{Binding Partner}" Grid.Column="3"></TextBox>
                </Grid>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

评论

0赞 dnxit 10/27/2016
Mattia,但你已经修复了列宽,如果标题需要超过 100px 的空间怎么办???
1赞 Jakub Pawlinski 12/8/2016
可以在 ColumnDefinitions 上使用 Grid.IsSharedSizeScope 和 SharedSizeGroup 来使其成为变量
0赞 dnxit 10/23/2016 #4

甚至 Listbox 也可以位于具有动态数据模板的用户控件中

    <Grid Style="{StaticResource TableHeader}">
        <Grid.Resources>
            <Style TargetType="{x:Type Border}" BasedOn="{StaticResource TableBorder}"/>
            <Style TargetType="{x:Type TextBlock}" BasedOn="{StaticResource TextTableHeader}">
                <Setter Property="TextWrapping" Value="Wrap"/>
            </Style>
        </Grid.Resources>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <Border BorderThickness="1">
            <TextBlock Text="Card"/>
        </Border>

        <Border Grid.Column="1" BorderThickness="0 1 1 1">
            <TextBlock Text="Type"/>
        </Border>

        <Border Grid.Column="2" BorderThickness="0 1 1 1">
            <TextBlock Text="Limit"/>
        </Border>

        <Border Grid.Column="3" BorderThickness="0 1 1 1">
            <TextBlock Text="Amount"/>
        </Border>

        <Border Grid.Column="4" BorderThickness="0 1 1 1">
            <TextBlock Text="Payment Due"/>
        </Border>

    </Grid>

    <ListBox Style="{StaticResource ListBoxStyle}"
             ItemsSource="{Binding Source}"
             SelectedItem="{Binding SelectedItem}"
             IsHitTestVisible="{Binding IsSelectionActive}"
             ItemTemplate="{Binding ItemTemplate}" />
</Grid>
0赞 patrick 1/20/2017 #5

ListBox 没有 . 不是最好的选择,因为它不支持 .如果你感到绝望并去,你得到的可能比你需要的要多得多。解决方案是使用HeaderTemplateListViewWidth="*"DataGridHeaderedItemsControl

只需更改要绑定到的集合的名称并更改绑定属性即可。

<!-- actual XAML -->
       <HeaderedItemsControl 

                                                    ItemTemplate="{DynamicResource CorrugationItemTemplate}" 
                                                    ItemsSource="{Binding CorrugationItemCollection}"
                                                    Style="{DynamicResource CorrugationStyle}"/>


    <!-- this goes in the resource dict --> 

        <DataTemplate x:Key="CorrugationItemTemplate">
            <Grid Width="Auto" Background="#e1e1e1">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="60"/>
                    <ColumnDefinition Width="60"/>
                    <ColumnDefinition Width="60"/>
                    <ColumnDefinition Width="60"/>
                </Grid.ColumnDefinitions>
                <Border Grid.Column="0"  Background="Lime" >
                    <Label Content="{Binding RangeLabel}" />
                </Border>
                <Border Grid.Column="1"   Background="Orange" >
                    <Label Content="{Binding LeftPreGrind}" />
                </Border>
                <Border Grid.Column="2"  Background="Lime" >
                    <Label Content="{Binding RightPreGrind}" />
                </Border>
                <Border Grid.Column="3"  Background="Orange" >
                    <Label Content="{Binding LeftPostGrind}" />
                </Border>
                <Border Grid.Column="4"  Background="Lime" >
                    <Label  Content="{Binding RightPostGrind}" />
                </Border>
            </Grid>
        </DataTemplate>

        <Style TargetType="{x:Type HeaderedItemsControl}" x:Key="CorrugationStyle">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type HeaderedItemsControl}">
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="*"/>
                                <ColumnDefinition Width="60"/>
                                <ColumnDefinition Width="60"/>
                                <ColumnDefinition Width="60"/>
                                <ColumnDefinition Width="60"/>
                            </Grid.ColumnDefinitions>
                            <Grid.RowDefinitions>
                                <RowDefinition Height="20pt"/>
                                <RowDefinition Height="4*"/>
                            </Grid.RowDefinitions>

                            <Border Grid.Column="0"  Background="Orange" >
                                <Label Content="Range" />
                            </Border>
                            <Border Grid.Column="1"   Background="Lime" >
                                <Label Content="LeftPreGrind" />
                            </Border>
                            <Border Grid.Column="2"  Background="Orange" >
                                <Label Content="RightPreGrind" />
                            </Border>
                            <Border Grid.Column="3"  Background="Lime" >
                                <Label Content="LeftPostGrind" />
                            </Border>
                            <Border Grid.Column="4"  Background="Orange" >
                                <Label  Content="RightPostGrind" />
                            </Border>




                            <Grid Grid.Row="1" Grid.ColumnSpan="5" Width="Auto" Height="Auto" Background="White">
                                <ItemsPresenter/>
                            </Grid>
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>