Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.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# 在ViewModel中检索REST数据_C#_Wpf_Mvvm - Fatal编程技术网

C# 在ViewModel中检索REST数据

C# 在ViewModel中检索REST数据,c#,wpf,mvvm,C#,Wpf,Mvvm,我正在尝试使用MVVM创建一个与RESTAPI集成的应用程序。我正在努力从视图模型中的端点提取数据,并将数据绑定到视图。这是我目前为止的测试结果 视图模型 class MainViewModel : INotifyPropertyChanged { public MainViewModel() { } private List<Schedule> schedules; public List<Schedule> Schedule

我正在尝试使用MVVM创建一个与RESTAPI集成的应用程序。我正在努力从视图模型中的端点提取数据,并将数据绑定到视图。这是我目前为止的测试结果

视图模型

class MainViewModel : INotifyPropertyChanged
{
    public MainViewModel()
    {

    }

    private List<Schedule> schedules;
    public List<Schedule> Schedules
    {
        get
        {
            if (schedules == null)
                GetData();
            return schedules;
        }
        set
        {
            schedules = value;
            RaisePropertyChanged("Schedules");
        }
    }
    private string homeTeam;
    public string HomeTeam
    {
        get
        {
            return homeTeam;
        }
        set
        {
            homeTeam = value;
            RaisePropertyChanged("HomeTeam");
        }
    }
    private async void GetData()
    {
        // Simulate pulling data from api
        string response;
        StorageFile file = await StorageFile.GetFileFromApplicationUriAsync(new Uri(@"ms-appx:///DesignData/GetLive.json"));
        using (StreamReader sRead = new StreamReader(await file.OpenStreamForReadAsync()))
            response = await sRead.ReadToEndAsync();

        // Deserialize data to class
        LiveStreamModel liveGames = JsonConvert.DeserializeObject<LiveStreamModel>(response);
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }
看法

模型


通常在过去,我会在视图的代码中调用GetData方法,并在那里为ListView设置ItemSource。如何使其正常工作?

在视图模型中设置属性:

// Deserialize data to class
LiveStreamModel liveGames = JsonConvert.DeserializeObject<LiveStreamModel>(response);
Schedules = liveGames.schedule;
顺便说一句,调度的getter不应该像那样调用GetData,而应该初始化调度。相反,请明确设置该字段,然后您可以异步调用GetData开始加载数据,然后再更新属性:

get
{
    if (schedules == null)
    {
        schedules = new List<Schedule>();
        GetData();
    }
    return schedules;
}

更好的方法是在其他地方显式地调用GetData,这样您就可以显式地设置视图模型,而不必在不受监控的后台运行异步进程。

Ah ok。所以实际上,我不需要在视图模型中为模型中明细表下的所有字段创建属性,对吗?不,公开明细表列表,然后将该列表数据绑定到列表框。因此,当您在列表视图中想要显示明细表的某些属性时,您可以直接访问它们。本质上,明细表成为列表视图项的简单视图模型。
// Deserialize data to class
LiveStreamModel liveGames = JsonConvert.DeserializeObject<LiveStreamModel>(response);
Schedules = liveGames.schedule;
<ListView ItemsSource="{Binding Schedules}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding homeTeam}" />
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>
get
{
    if (schedules == null)
    {
        schedules = new List<Schedule>();
        GetData();
    }
    return schedules;
}