我想在我的应用程序中显示数据库中的数据。我将数据获取到视图模型以列出属性。我检查了whit调试器,它对我的列表数据正确无误,但是在单击继续后,列表位置没有任何显示。另一个Bindnig正常工作。
型号代码
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; }
}
查看代码
<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>
ViewModel代码
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的Requests属性中,我看到null,但在集合中之前的列表中有4条记录:https://i.stack.imgur.com/GFc4C.png
答案 0 :(得分:0)
您没有在Requests
属性上引发PropertyChanged事件。
您的ViewModel需要实现INotifyPropertyChanged
。大多数MVVM库都将使用诸如RaisePropertyChanged
,FirePropertyChanged
或NotifyPropertyChanged
之类的方法来触发事件。
通常如下所示:
private List<Request> _requests;
public List<Request> Requests
{
get => _requests;
set
{
_requests = value;
RaisePropertyChanged();
}
}
在触发此事件之前,不会通知UI属性更改。
或者,您可以将Results
设为ObservableCollection
,而从不覆盖实例,而只需在其中添加和删除项目即可。像这样:
public ObservableCollection<Request> Requests { get; } = new ObservableCollection<Request>();
然后在获取请求后:
var requests = await App.Database.GetRequestsAsync();
foreach(var request in requests)
Requests.Add(request);
由于ObservableCollection
实现了INotifyCollectionChanged
和INotifyPropertyChanged
并正确触发了这些事件,所以当集合中的项目发生更改时,它将通知UI。