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