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我不知道Xamarin有什么问题,我认为这是个bug。通过改变在观察对象中声明属性的方式,这个问题得到了解决。例如:
这失败了
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;}
}