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

Xamarin.Forms ListView点击项无法展开问题求助

问题分析与解决方案

我仔细看了你的代码,页面不更新的核心原因是你的Item模型没有实现INotifyPropertyChanged接口,另外还有个小拼写细节需要注意,咱们一步步来解决:

1. 让Item模型实现属性变化通知

Xamarin.Forms的绑定需要数据源通过INotifyPropertyChanged来通知UI属性变化。你原来的Item只是个普通类,修改IsVisiable属性后,UI完全不知道这个变化,所以不会更新视图。

修改后的Item类代码:

using System.ComponentModel;
using System.Runtime.CompilerServices;

public class Item : INotifyPropertyChanged
{
    public int Id { get; set; }
    public string UserId { get; set; }
    public string Name { get; set; }
    public string Category { get; set; }
    public string Quality { get; set; }
    public int Size { get; set; }
    public decimal Price { get; set; }

    private bool _isVisible;
    // 这里建议改成标准拼写IsVisible,和Xamarin.Forms内置属性命名一致,避免混淆
    public bool IsVisible
    {
        get => _isVisible;
        set
        {
            if (_isVisible != value)
            {
                _isVisible = value;
                OnPropertyChanged();
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

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

2. 修正XAML中的绑定拼写

因为我们把属性名改成了标准的IsVisible,所以需要同步修改XAML里的绑定:

<StackLayout IsVisible="{Binding IsVisible}">
    <Label Text="{Binding Category}" />
    <Label Text="{Binding Quality}" />
    <Label Text="{Binding Size}" />
    <Label Text="{Binding Price}" />
</StackLayout>

3. 简化ViewModel中的逻辑

原来你通过移除再插入Item来触发更新,这完全没必要——只要Item实现了INotifyPropertyChanged,直接修改属性就会自动通知UI。简化后的HideOrShowItem方法:

public void HideOrShowItem(Item item)
{
    if (_oldItem == item)
    {
        // 点击同一个项,切换显示状态
        item.IsVisible = !item.IsVisible;
    }
    else
    {
        // 点击新项,先隐藏之前的项,再显示当前项
        if (_oldItem != null)
        {
            _oldItem.IsVisible = false;
        }
        item.IsVisible = true;
    }
    _oldItem = item;
}

为什么之前的代码不生效?

你之前修改IsVisiable后,虽然属性值变了,但因为没有PropertyChanged事件通知,UI绑定系统完全不知道这个变化。而你通过Items.Remove(item); Items.Insert(index, item);试图触发更新,这种方式只会触发Items集合的变化通知,但Item内部的属性变化依然没有被UI感知到,所以页面还是不会更新详情区域。

现在修改后,只要你点击项修改IsVisible属性,UI就会立刻收到通知,自动展开/隐藏详情区域了。

内容的提问来源于stack exchange,提问作者Khalid Hex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:44:05