将行动态添加到 ListView 中的网格

Posted

技术标签:

【中文标题】将行动态添加到 ListView 中的网格【英文标题】:Add rows dynamically to grid within ListView 【发布时间】:2020-08-12 07:46:30 【问题描述】:

我有以下ListView-

<ListView x:Name="listViewm" ItemsSource=" Binding Rows ">
        <ListView.Header >
            <Grid >
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="1*"></ColumnDefinition>
                    <ColumnDefinition Width="1*"></ColumnDefinition>
                    <ColumnDefinition Width="1*"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <Label Text="Name" Grid.Column="3"  FontSize="Medium" />
                <Label Text="Age" Grid.Column="2" FontSize="Medium" />
                <Label Text="DOB" Grid.Column="1" FontSize="Medium" />
            </Grid>
        </ListView.Header>

        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Grid >
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="1*"></ColumnDefinition>
                            <ColumnDefinition Width="1*"></ColumnDefinition>
                            <ColumnDefinition Width="1*"></ColumnDefinition>
                        </Grid.ColumnDefinitions>

                        <!--I need my Row values here-->

                    </Grid>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

我需要为列表中的每个条目创建一行并将其动态添加到网格中 -

protected override void OnAppearing()

    CreateGrid();


public ObservableCollection<Row> Rows  get; set; 

public class Row

    public string Name  get; set; 
    public string Age  get; set; 
    public string DOB  get; set; 


public void CreateGrid()

    Rows = new ObservableCollection<Row>();
    Rows.Clear();

    foreach(var entry in entryList)  // entryList just contains values I use to populate row info 

        var row = new Row();
        row.Name = entry.name;
        row.Age = entry.age;
        row.DOB = entry.dob;

        Rows.Add(row);
    

itemSource 未绑定,因此没有创建新行,我尝试在 XAML 中删除 ItemsSource=" Binding Rows ",并在后面的代码中使用 listViewm.ItemsSource = Rows,但这也不起作用。

因此,如果entryList 有 3 个针对 John、Bob 和 Bill 的测试条目,那么表格应该如下所示 -

+----------------+
| Name  Age DOB  |
+----------------+
| John  31 06/09 |
| Bill  32 07/10 |
| Bob   34 08/11 |
+----------------+

【问题讨论】:

【参考方案1】:

您没有将您的值添加到列表视图中。

<ListView x:Name="listViewm" ItemsSource=" Binding Rows ">
    <ListView.Header >
        <Grid >
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="1*"></ColumnDefinition>
                <ColumnDefinition Width="1*"></ColumnDefinition>
                <ColumnDefinition Width="1*"></ColumnDefinition>
            </Grid.ColumnDefinitions>
            <Label Text="Name" Grid.Column="3"  FontSize="Medium" />
            <Label Text="Age" Grid.Column="2" FontSize="Medium" />
            <Label Text="DOB" Grid.Column="1" FontSize="Medium" />
        </Grid>
    </ListView.Header>

    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <Grid >
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="1*"></ColumnDefinition>
                        <ColumnDefinition Width="1*"></ColumnDefinition>
                        <ColumnDefinition Width="1*"></ColumnDefinition>
                    </Grid.ColumnDefinitions>

                    <!--I need my Row values here-->
                    <Label Text="Binding Name" />
                    <Label Grid.Column="1" Text="Binding Age" />
                    <Label Grid.Column="2" Text="Binding DOB" />

                </Grid>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>

【讨论】:

仍然没有值 :( 您如何检索您的 entryList 的数据?确保 entryList 不为 null 或为空。 条目列表有值,我什至只是手动创建了一个新行并将其添加到行集合中,仍然没有:(我是移动开发新手,但也许这与视图模型有关? 您的 entryList 应该是公开的而不是私有的。你能说明你是如何声明它的吗?【参考方案2】:

我可能是错的,但是当你初始化 Rows 对象时,你应该更新列表视图的 itemsSource。

public void CreateGrid()

    Rows = new ObservableCollection<Row>();
    Rows.Clear();
    // Rows is initialized as a new collection so update the itemssource
    listViewm.ItemsSource = Rows;

    foreach(var entry in entryList) 
     
        // entryList just contains values I use to populate row info 
        var row = new Row();
        row.Name = entry.name;
        row.Age = entry.age;
        row.DOB = entry.dob;

        Rows.Add(row);
    

【讨论】:

最好在屏幕类构造函数中初始化 Rows 组件,而不是在 CreateGrid 函数中。

以上是关于将行动态添加到 ListView 中的网格的主要内容,如果未能解决你的问题,请参考以下文章

将行动态添加到同一 HTML 中的 2 个不同表中

如何修复动态适配器包装器 Android 中的 notifyDataSetChanged/ListView 问题

将行动态添加到TableLayoutPanel会在不同的行号(位置)上显示

如何将行动态添加到表格布局中

使用带有分页和排序的 ajax 将行动态添加到数据表

Flutter 动画列表:有条件地添加 ListView 项