WPF中的ListBox,ListView和DataGridView有啥区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF中的ListBox,ListView和DataGridView有啥区别相关的知识,希望对你有一定的参考价值。

参考技术A ListView 控件是一种从 ListBox 派生而来的 ItemsControl。 通常,该控件的项是数据集合的成员,并且表示为 ListViewItem 对象。
ListBox 是一个 ItemsControl,这意味着它可以包含任何类型(如字符串、图像或面板)对象的集合。 有关更多信息,请参见 ItemsControl 类。
ListBox 中有多个项可见,这与 ComboBox 不同,后者只有选定项可见,除非 IsDropDownOpen 属性为 true。 SelectionMode 属性确定一次是否可选择 ListBox 中的多个项。

wpf没有DataGridView,只有DataGrid。
DataGrid 控件提供一种灵活的方式显示一个数据在行和列中。 DataGrid 包括内置列类型和模板列承载的自定义内容。 内置行类型包含可用于在单元格值下显示附加内容的下拉详细信息部分。

wpf中可以说控件没有明确区分,可以通过修改template修改显示样式。本回答被提问者和网友采纳

WPF 中的多列列表框

【中文标题】WPF 中的多列列表框【英文标题】:Multicolumn ListBox in WPF 【发布时间】:2012-02-13 05:24:00 【问题描述】:

我有 3 个TextBoxes 和 1 个Button,并希望将每个TextBoxes 数据输入到单独的列中的ListBox

我知道如何将数据输入一列:

listbox1.Items.Add(TextBox1.text);

但是如何将数据输入到多个列中?

我正在使用 .NET WPF。我想使用ListBoxListView

my window

【问题讨论】:

为什么不是DataGridListView 不会通知 DataSource 选择更改。 【参考方案1】:

你想要一个 ListView 代替:

类似这样的:

<ListView ItemsSource="Binding SourceCollection">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Test1" DisplayMemberBinding="Binding Test1" />
            <GridViewColumn Header="Test2" DisplayMemberBinding="Binding Test2" />
            <GridViewColumn Header="Test3" DisplayMemberBinding="Binding Test3" />
            <GridViewColumn Header="Button">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Button>Button Text</Button>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

【讨论】:

感谢快速回答的朋友,我应该在 xaml 代码中使用它 @MostafaMaklad:就SourceCollection.Add(MyNewItem); 看来,ListBox 没有更新数据绑定。我错过了什么吗?还是我必须实现一些通知定义?【参考方案2】:

As Ray correctly points out,ListView 将完成这项工作。但是,如果您坚持使用和/或想要使用 ListBox,您也可以使用带有 Grid 的 ItemTemplate 并在 ListBox 本身上设置Grid.IsSharedSizeScope property。例如:

<ListBox ItemsSource="Binding DataSource" Grid.IsSharedSizeScope="True">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" SharedSizeGroup="Column1"/>
                    <ColumnDefinition Width="Auto" SharedSizeGroup="Column2"/>
                    <ColumnDefinition Width="Auto" SharedSizeGroup="Column3"/>
                </Grid.ColumnDefinitions>
                <!-- Assumes MVVM and you wish to bind to properties and commands -->
                <TextBlock Grid.Column="0" Text="Binding ColumnOneText"/>
                <TextBlock Grid.Column="1" Text="Binding ColumnTwoText"/>
                <TextBlock Grid.Column="2" Text="Binding ColumnThreeText"/>
                <Button Content="ClickMe" Command="Binding ButtonExecutionCommand"/>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

这是一个巧妙的技巧,也可以应用于您有多个 Grid 实例(即:根据本例每个 ListBoxItem 一个)并希望共享列的其他情况。

【讨论】:

代码必须包含在 中,因为现在支持 ItemTemplate 属性的子级 很棒的解决方案。谢谢 谢谢,兄弟。你把我从沉思ListView API 的苦差事中解救了出来:)。【参考方案3】:

使用GroupboxDockpanel

<GroupBox Width="250"
                          Margin="10,0,0,0"                          
                          FontSize="20"
                          Header="کسورات"
                          Style="StaticResource Gb">
                    <ListBox Margin="0" AlternationCount="2">
                        <ListBoxItem>
                            <Border Margin="0"
                                    BorderBrush="#ddd"
                                    BorderThickness="0,1,0,1">
                                <DockPanel Background="#f9f9f9" LastChildFill="True">


                                    <controls2:TimeEditBox DockPanel.Dock="Right"
                                                           FontSize="13"
                                                           Mask="00:00"
                                                           Text="00:00"
                                                           TextAlignment="Center"
                                                           controls2:TextBoxMaskBehavior.Mask="Integer" />
                                    <TextBox Width="50"
                                             Margin="0,0,5,0"
                                             DockPanel.Dock="Right"
                                             FontSize="13"
                                             Text="122"
                                             TextAlignment="Center"
                                             controls2:TextBoxMaskBehavior.Mask="Integer" />
                                    <TextBlock VerticalAlignment="Center"
                                               FontSize="13"
                                               Text="غیبت"
                                               TextAlignment="Center" />
                                </DockPanel>
                            </Border>
                        </ListBoxItem>
                      **</ListBox>**
                </GroupBox>

【讨论】:

以上是关于WPF中的ListBox,ListView和DataGridView有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

UI响应性并使用WPF中的“SelectedItem”ListView / ListBox

WPF ListBox/ListView/DataGrid 列表滚动与虚拟化

WPF ListView和ListBox等双击事件问题

WPF ListView ListBox 常用的样式记录

WPF ItemsControl ListBox ListView比较

2022-03-23 WPF面试题 ListBox 与 ListView - 如何选择以及何时进行数据绑定?