Listview Xamarin表单列表视图不显示内容

Listview Xamarin表单列表视图不显示内容,listview,xamarin.forms,Listview,Xamarin.forms,我正在呈现此ListView <StackLayout> <Label Text="Test"/> //This Label is getting rendered <ListView ItemsSource="{Binding MusicList,Mode=TwoWay}" HasUnevenRows="True" IsPullToRefreshEnabled="True"

我正在呈现此
ListView

<StackLayout>
<Label Text="Test"/> //This Label is getting rendered
<ListView  ItemsSource="{Binding MusicList,Mode=TwoWay}"
                HasUnevenRows="True"
                IsPullToRefreshEnabled="True"
                CachingStrategy="RecycleElement"
                SeparatorColor="DarkGray">
      <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <Label Text="{Binding Name}" TextColor="Black"/>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>
这是我的
ViewModel
,这里我调用API方法来获取数据

    private ObservableCollection<Music> _MusicList=new ObservableCollection<Music>();
    public ObservableCollection<Music> MusicList
    {
        get { return _MusicList; }
        set
        {
            if (_MusicList != value)
            {
                _MusicList = value;
                OnPropertyChanged("_MusicList");
            }
        }
    }
    public MainViewModel()
    {
        api = new ApiHelper();
        GetSongs();
    }

    public async void GetSongs()
    {
        _MusicList = new ObservableCollection<Music>(await api.GetMusicListAsync());
    }
private observateCollection\u MusicList=new observateCollection();
公众可观察的音乐收藏家
{
获取{return\u MusicList;}
设置
{
if(_MusicList!=值)
{
_MusicList=价值;
不动产变更(“_MusicList”);
}
}
}
公共主视图模型()
{
api=新的ApiHelper();
GetSongs();
}
公共异步void GetSongs()
{
_MusicList=新的ObservableCollection(等待api.GetMusicListAsync());
}
数据来自
可观察收集

更新

为了测试,我尝试绑定一个简单的字符串列表
ListStrings=newlist{“a”、“B”、“C”、“D”、“E”、“F”}但它也没有出现

更新
现在我重写了onAppearing方法,初始化了我的列表,并将ListView项资源设置为它。现在它可以工作了。但是我不知道为什么它不能与绑定一起工作。

有一些事情可能会有问题

  • ItemsSource=“{Binding MusicList,Mode=TwoWay}”
    是否有充分的理由将其设置为双向?如果没有,就不要这样做
  • InitializeComponent()之后设置您的
    BindingContext
  • 获取数据时,不要创建新的
    observeableCollection
    。通过创建新集合,将丢失数据绑定。相反,请按如下方式进行更改:

    public async void GetSongs()
    {
        var result = await api.GetMusicListAsync();
    
        foreach (var r in result)
            _MusicList.Add(r);
    }
    

  • 我认为你犯了一个错误,因为你的财产发生了变化:

    private ObservableCollection<Music> _MusicList=new 
    ObservableCollection<Music>();
    public ObservableCollection<Music> MusicList
    {
        get { return _MusicList; }
        set
        {
    
                _MusicList = value;
                OnPropertyChanged("MusicList");  //You should raise property change on your Binding variable.
    
        }
    }
    
    我希望它能帮助您实现您的可观察集合。这是扩展的可观察集合,如果需要,您可以使用并进一步扩展它:

    public class ExtendedCollection<T> : ObservableCollection<T>
    {
        public ExtendedCollection()
            : base()
        {
        }
        public ExtendedCollection(IEnumerable<T> collection)
            : base(collection)
        {
        }
    
        public ExtendedCollection(List<T> list)
            : base(list)
        {
        }
    
        /// <summary>
        /// Reset the existings items and fills the new items provided.
        /// </summary>
        /// <param name="range"></param>
        public void Reset(IEnumerable<T> range)
        {
            this.Items.Clear();
    
            if (range != null)
            {
                AddRange(range);
            }
    
        }
    
        /// <summary>
        /// Add all items in the range;
        /// </summary>
        /// <param name="range"></param>
        public void AddRange(IEnumerable<T> range)
        {
            foreach (var item in range)
            {
    
                Items.Add(item);
            }
    
            //Raise the property change!
            this.OnPropertyChanged(new PropertyChangedEventArgs("Count"));
            this.OnPropertyChanged(new PropertyChangedEventArgs("Item[]"));
            this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
        }
    }
    
    公共类ExtendedCollection:ObservableCollection
    {
    公共扩展集合()
    :base()
    {
    }
    公共扩展集合(IEnumerable集合)
    :基本(集合)
    {
    }
    公共扩展集合(列表)
    :基本(列表)
    {
    }
    /// 
    ///重置现有项目并填充提供的新项目。
    /// 
    /// 
    公共无效重置(IEnumerable范围)
    {
    this.Items.Clear();
    如果(范围!=null)
    {
    AddRange(范围);
    }
    }
    /// 
    ///添加范围内的所有项目;
    /// 
    /// 
    public void AddRange(IEnumerable range)
    {
    foreach(范围内的var项目)
    {
    项目。添加(项目);
    }
    //提出财产变更!
    此.OnPropertyChanged(新PropertyChangedEventArgs(“计数”);
    此.OnPropertyChanged(新的PropertyChangedEventArgs(“项目[]”);
    this.OnCollectionChanged(新建NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
    }
    }
    
    今天我找到了解决方案

        public MainPage()
        {
            InitializeComponent();
            BindingContext = this; //Added this 
        }
    

    刚刚添加了
    BindingContext=this通过改变在观察对象中声明属性的方式,这个问题得到了解决。例如:

    这失败了

    public class MusicItem
    {
         public string Name;
    }
    
    这是成功的:

    public class MusicItem
    {
         public string Name {get; set;}
    }
    

    绑定在第一个示例中找不到属性名称,但在第二个示例中有效。

    替换此
    MusicList=newobserveCollection(wait api.GetMusicListAsync())\u MusicList=newobservetecollection(wait api.GetMusicListAsync())
    您的
    音乐
    类中是否有属性
    名称
    ?很抱歉,没有任何帮助..我重写了onAppearing方法,然后它显示了列表。。还不明白问题所在:/抱歉,但没有任何帮助..我覆盖了onAppearing方法,然后它显示了列表。。还不明白这个问题:/请用你迄今为止尝试过的方法更新这个问题。我遵循了@Gerald Versluis的答案,并且成功了。在接收数据时,我正在创建一个新的可观察对象,我应该使用来自可观察对象的“add()方法”。此外,我还必须在ViewModel的构造函数中初始化Observable。
        public MainPage()
        {
            InitializeComponent();
            BindingContext = this; //Added this 
        }
    
    public class MusicItem
    {
         public string Name;
    }
    
    public class MusicItem
    {
         public string Name {get; set;}
    }