【问题标题】:Add rows dynamically to grid within ListView将行动态添加到 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 |
+----------------+

【问题讨论】:

    标签: c# xaml listview xamarin.forms


    【解决方案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 函数中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多