微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CollectionView不显示列表中的数据

如何解决CollectionView不显示列表中的数据

我想在我的应用程序中显示数据库中的数据。我将数据获取到视图模型以列出属性。我检查了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

解决方法

您没有在Requests属性上引发PropertyChanged事件。

您的ViewModel需要实现INotifyPropertyChanged。大多数MVVM库都将使用诸如RaisePropertyChangedFirePropertyChangedNotifyPropertyChanged之类的方法来触发事件。

通常如下所示:

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实现了INotifyCollectionChangedINotifyPropertyChanged并正确触发了这些事件,所以当集合中的项目发生更改时,它将通知UI。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。