将行动态添加到 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 中的网格的主要内容,如果未能解决你的问题,请参考以下文章
如何修复动态适配器包装器 Android 中的 notifyDataSetChanged/ListView 问题