C# CollectionView don';t显示列表中的数据
我想在我的应用程序中显示数据库中的数据。我将数据获取到视图模型以列出属性。我检查了whit debugger,它对我的列表数据正确无误,但在我单击“继续”后,列表位置中没有显示任何内容。另一个Bindnig可以正常工作 模型代码C# CollectionView don';t显示列表中的数据,c#,xaml,xamarin,C#,Xaml,Xamarin,我想在我的应用程序中显示数据库中的数据。我将数据获取到视图模型以列出属性。我检查了whit debugger,它对我的列表数据正确无误,但在我单击“继续”后,列表位置中没有显示任何内容。另一个Bindnig可以正常工作 模型代码 public class Request { [PrimaryKey,AutoIncrement] public int Id { get; set; } public string Title { get; set; } publ
public class Request
{
[PrimaryKey,AutoIncrement]
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public bool IsFinished { get; set; }
[DataType(DataType.Date)]
public DateTime Date { get; set; }
}
public List<Request> Requests { get; private set; }
public string Today { get => DateTime.Now.Date.ToShortDateString(); }
public string NavTitle { get => $"You have { itemNumber} task to do"; }
public Command AddCommand { get; }
public bool IsListVisible
{
get => itemNumber != 0;
}
public bool IsLabelVisible { get => !IsListVisible; }
int itemNumber;
public async void GetRequest()
{
Requests = await App.Database.GetRequestAsync();
itemNumber = Requests.Count;
}
视图代码
<CollectionView x:Name="RequestList" ItemsSource="{Binding Requests}" Grid.Row="0" Grid.Column="0" IsVisible="{Binding Path=IsListVisible}">
<CollectionView.ItemTemplate>
<DataTemplate>
<StackLayout>
<Frame>
<Label Text="{Binding Title}"/>
</Frame>
</StackLayout>
</DataTemplate>
</CollectionView.ItemTemplate>
</CollectionView>
视图模型代码
public class Request
{
[PrimaryKey,AutoIncrement]
public int Id { get; set; }
public string Title { get; set; }
public string Description { get; set; }
public bool IsFinished { get; set; }
[DataType(DataType.Date)]
public DateTime Date { get; set; }
}
public List<Request> Requests { get; private set; }
public string Today { get => DateTime.Now.Date.ToShortDateString(); }
public string NavTitle { get => $"You have { itemNumber} task to do"; }
public Command AddCommand { get; }
public bool IsListVisible
{
get => itemNumber != 0;
}
public bool IsLabelVisible { get => !IsListVisible; }
int itemNumber;
public async void GetRequest()
{
Requests = await App.Database.GetRequestAsync();
itemNumber = Requests.Count;
}
公共列表请求{get;private set;}
今天的公共字符串{get=>DateTime.Now.Date.ToSortDateString();}
公共字符串NavTitle{get=>$“您有{itemNumber}任务要做”;}
公共命令AddCommand{get;}
公共bool IsListVisible
{
get=>itemNumber!=0;
}
public bool IsLabelVisible{get=>!IsListVisible;}
整数项目编号;
公共异步void GetRequest()
{
Requests=wait App.Database.GetRequestAsync();
itemNumber=请求数;
}
在get中的Requests属性中,我看到null,但在set之前,list中有4条记录:您没有在
Requests
属性上引发PropertyChanged事件
您的ViewModel需要实现INotifyPropertyChanged
。大多数MVVM库都有一个方法,如RaisePropertyChanged
、FirePropertyChanged
或NotifyPropertyChanged
,可用于触发事件
这通常看起来像:
private List<Request> _requests;
public List<Request> Requests
{
get => _requests;
set
{
_requests = value;
RaisePropertyChanged();
}
}
然后在获取请求后:
var requests = await App.Database.GetRequestsAsync();
foreach(var request in requests)
Requests.Add(request);
由于
observeCollection
实现了INotifyCollectionChanged
和INotifyPropertyChanged
并正确触发这些事件,因此当集合中的项目发生更改时,它将通知UI。您是否正确设置了BindingContext
是否为GetRequest()在绑定发生后激发,则它将不会更新,除非您正确使用inotifypropertychange设置BindingContex@Jason我在OnAppearing void中运行GetRequest,它运行正常,因为当我将它们放入此方法时,它到达了断点,并且在断点请求中具有正确的值。这与此无关。此时绑定已经发生,除非您使用INPC,否则您的UI将不会收到数据已更改的通知。您可以通过在数据请求完成后手动设置ItemsSource来轻松测试这一点。在OnAppearing中获取请求后是否尝试设置BindingContext?我将其添加到代码中,但它不起作用。看起来我将get请求更正为我的列表,然后当设置代码结束时,它将列表更改为null。我在xaml代码中做了一些更改,并且列表请求中的get code属性返回null。也许我不应该在OnAppearing方法中调用GetRequests?