You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin页面间传递列表填充ListView及显示异常求助

我来帮你搞定这个问题,分两步走:先搞定页面间的列表传递,再解决ListView不显示内容的坑。

第一步:通过Navigation.PushModalAsync传递列表到目标页面

核心思路是给目标页面加一个带参数的构造函数,跳转时把源页面的列表传进去:

1. 给目标页面添加接收列表的构造函数

假设你的列表是List<string>类型(如果是自定义实体类,替换成你的类型即可),目标页面的代码示例如下:

public partial class TargetPage : ContentPage
{
    private List<string> _receivedList;

    // 带列表参数的构造函数
    public TargetPage(List<string> sourceList)
    {
        InitializeComponent();
        _receivedList = sourceList;
        // 先把列表赋值给ListView的ItemsSource,后面再排查显示问题
        MyListView.ItemsSource = _receivedList;
    }
}

2. 源页面跳转时传递列表

在首个页面的跳转触发事件(比如按钮点击)里,这样调用跳转:

// 假设你的源列表是已经填充好数据的sourceList
private async void GoToTargetPage_Clicked(object sender, EventArgs e)
{
    await Navigation.PushModalAsync(new TargetPage(sourceList));
}

第二步:解决ListView空白不显示的问题

你说手动设置ItemsSource后还是空白,只有红色背景,大概率是ItemTemplate没配置对,或者布局/数据有问题,给你列几个必查的点:

1. 必须正确配置ItemTemplate

ListView要显示内容,必须通过ItemTemplate定义每个列表项的样式,XAML示例如下(如果是代码写UI,逻辑一致):

<ListView x:Name="MyListView" BackgroundColor="Red" VerticalOptions="FillAndExpand">
    <!-- 关键:没有这个ItemTemplate,ListView肯定显示空白 -->
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <!-- 如果是string类型列表,用{Binding .}绑定整个项;如果是实体类,绑定对应的公共属性,比如{Binding ProductName} -->
                <Label Text="{Binding .}" Padding="10" FontSize="16" TextColor="Black" />
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
> 注意:如果是自定义实体类,绑定的属性必须是**public**的,否则UI无法访问到数据。

## 2. 确认列表真的有数据
有时候你以为列表有内容,但实际是空的,跳转前可以加个校验:
```csharp
if(sourceList == null || sourceList.Count == 0)
{
    await DisplayAlert("提示", "当前列表为空", "确定");
    return;
}
await Navigation.PushModalAsync(new TargetPage(sourceList));

3. 确保在UI线程操作数据

如果你的列表是异步加载的,赋值ItemsSource时必须切换到UI线程:

// 异步获取数据后,通过Device.BeginInvokeOnMainThread确保在UI线程更新
Device.BeginInvokeOnMainThread(() =>
{
    MyListView.ItemsSource = _receivedList;
});

4. 检查布局约束

有时候父布局(比如StackLayout、Grid)的设置会把ListView压缩,给ListView加上VerticalOptions="FillAndExpand",确保它能占满可用空间,就像上面XAML示例里那样。

5. MVVM模式下要实现INotifyPropertyChanged

如果用MVVM模式把列表放在ViewModel里,ViewModel必须实现INotifyPropertyChanged接口,这样属性变化时UI才会同步更新:

public class TargetViewModel : INotifyPropertyChanged
{
    private List<string> _myList;
    public List<string> MyList
    {
        get => _myList;
        set
        {
            _myList = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

然后在目标页面构造函数里绑定ViewModel:

public TargetPage(List<string> sourceList)
{
    InitializeComponent();
    var viewModel = new TargetViewModel();
    viewModel.MyList = sourceList;
    BindingContext = viewModel;
}

对应的XAML绑定ItemsSource:

<ListView x:Name="MyListView" BackgroundColor="Red" ItemsSource="{Binding MyList}" VerticalOptions="FillAndExpand">
    <!-- ItemTemplate同上 -->
</ListView>

按照上面的步骤逐一排查,先确保列表能成功传递,再解决ListView的显示问题,应该就能搞定啦。

内容的提问来源于stack exchange,提问作者Samuel Mungy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:19:20