无法在 Xamarin 的 ListView 上从 JSON 输出信息
Can't output info from JSON on a ListView in Xamarin
我一直在尝试使用 MVVM 学习 Xamarin,但我仍在苦苦挣扎。
我遇到的问题主要是尝试从 ListView 中的 JSON 文件输出信息。
如果我只是忽略 MVVM 并将代码直接添加到视图中,它会完美运行。
但是,当我尝试使用 ViewModel 中的代码时,它找不到绑定的 Itemssource。
代码:
ListPageVM
using SaveUp.Model;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using SaveUp.View;
using System.Reflection;
using System.Text;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace SaveUp.ViewModel
{
public class ListPageVM : INotifyPropertyChanged
{
private ObservableCollection<MainModel> data;
public ListPageVM()
{
var assembly = typeof(ListPageVM).GetTypeInfo().Assembly;
Stream stream = assembly.GetManifestResourceStream("SaveUp.eintraege.json");
using (var reader = new StreamReader(stream))
{
var json = reader.ReadToEnd();
List<MainModel> dataList = JsonConvert.DeserializeObject<List<MainModel>>(json);
data = new ObservableCollection<MainModel>(dataList);
lw.ItemsSource = data;
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
ListPage.xaml
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="SaveUp.View.ListPage"
xmlns:viewModel="clr-namespace:SaveUp.ViewModel"
x:DataType="viewModel:ListPageVM">
<ContentPage.BindingContext>
<viewModel:ListPageVM/>
</ContentPage.BindingContext>
<ContentPage.Content>
<StackLayout>
<ListView x:Name="lw"
Footer="">
<ListView.ItemTemplate>
<DataTemplate>
<TextCell Text="{Binding Geld}" Detail="{Binding Detail}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage.Content>
</ContentPage>
eintraege.json
[
{
"Geld": 500.00,
"Detail": "Kaffee"
},
{
"Geld": 250.00,
"Detail": "Creme"
},
{
"Geld": 100.00,
"Detail": "Yogurt"
}
]
首先,这需要有一个public属性
private ObservableCollection<MainModel> data;
应该看起来像
private ObservableCollection<MainModel> data;
public ObservableCollection<MainModel> Data {
get
{
return data;
{
set
{
data = value;
OnPropertyChanged();
}
}
如果您使用的是 MVVM,那么您的 VM 不会直接与您的视图交互
// get rid of this
lw.ItemsSource = data;
然后在您的 XAML 中使用绑定设置 ItemsSource
<ListView ItemsSource="{Binding Data}" ...
我一直在尝试使用 MVVM 学习 Xamarin,但我仍在苦苦挣扎。
我遇到的问题主要是尝试从 ListView 中的 JSON 文件输出信息。
如果我只是忽略 MVVM 并将代码直接添加到视图中,它会完美运行。
但是,当我尝试使用 ViewModel 中的代码时,它找不到绑定的 Itemssource。
代码:
ListPageVM
using SaveUp.Model;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using SaveUp.View;
using System.Reflection;
using System.Text;
using System.ComponentModel;
using System.Runtime.CompilerServices;
namespace SaveUp.ViewModel
{
public class ListPageVM : INotifyPropertyChanged
{
private ObservableCollection<MainModel> data;
public ListPageVM()
{
var assembly = typeof(ListPageVM).GetTypeInfo().Assembly;
Stream stream = assembly.GetManifestResourceStream("SaveUp.eintraege.json");
using (var reader = new StreamReader(stream))
{
var json = reader.ReadToEnd();
List<MainModel> dataList = JsonConvert.DeserializeObject<List<MainModel>>(json);
data = new ObservableCollection<MainModel>(dataList);
lw.ItemsSource = data;
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}
ListPage.xaml
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="SaveUp.View.ListPage"
xmlns:viewModel="clr-namespace:SaveUp.ViewModel"
x:DataType="viewModel:ListPageVM">
<ContentPage.BindingContext>
<viewModel:ListPageVM/>
</ContentPage.BindingContext>
<ContentPage.Content>
<StackLayout>
<ListView x:Name="lw"
Footer="">
<ListView.ItemTemplate>
<DataTemplate>
<TextCell Text="{Binding Geld}" Detail="{Binding Detail}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage.Content>
</ContentPage>
eintraege.json
[
{
"Geld": 500.00,
"Detail": "Kaffee"
},
{
"Geld": 250.00,
"Detail": "Creme"
},
{
"Geld": 100.00,
"Detail": "Yogurt"
}
]
首先,这需要有一个public属性
private ObservableCollection<MainModel> data;
应该看起来像
private ObservableCollection<MainModel> data;
public ObservableCollection<MainModel> Data {
get
{
return data;
{
set
{
data = value;
OnPropertyChanged();
}
}
如果您使用的是 MVVM,那么您的 VM 不会直接与您的视图交互
// get rid of this
lw.ItemsSource = data;
然后在您的 XAML 中使用绑定设置 ItemsSource
<ListView ItemsSource="{Binding Data}" ...