WPF中的多列列表框

26

我有3个文本框(TextBox)和1个按钮(Button),希望将每个文本框的数据分列输入到一个列表框(ListBox)中。

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

listbox1.Items.Add(TextBox1.text);

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

我正在使用.NET WPF。我想要使用一个ListBox或者一个ListView

我的窗口


为什么不使用 DataGridListView 无法通知数据源进行选择更改。 - DrMarbuse
3个回答

37
你想要一个 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代码中使用它吗? - user1156309
@MostafaMaklad:只需使用SourceCollection.Add(MyNewItem); - DefenestrationDay
看起来,ListBox没有更新数据绑定。我有什么遗漏的吗?还是我需要实现一些通知定义? - DrMarbuse

36

正如Ray所指出的那样,ListView可以完成任务。但是如果您被困住并且/或者想要使用ListBox,您也可以使用一个带有Grid的ItemTemplate,并在ListBox本身上设置Grid.IsSharedSizeScope属性。例如:

<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一个Grid),并且希望共享某一列。


1
<Grid> 代码必须包含在 <DataTemplate> 中,因为 <Grid> 现在是 ItemTemplate 属性的支持子元素。 - Patrick Leitermann
2
很棒的解决方案。谢谢。 - Null Pointer
1
谢谢,兄弟。你让我免于苦思冥想ListView API的烦恼 :)。 - z33k

5
使用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>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接