Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CollectionView don';t显示列表中的数据_C#_Xaml_Xamarin - Fatal编程技术网

C# CollectionView don';t显示列表中的数据

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

我想在我的应用程序中显示数据库中的数据。我将数据获取到视图模型以列出属性。我检查了whit debugger,它对我的列表数据正确无误,但在我单击“继续”后,列表位置中没有显示任何内容。另一个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; }

  
}
    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?