我已经在WP8中实现了MVVM,但是我在ViewModel类中调用方法时遇到了问题,这里是我从我的ViewModel类调用方法的App.xaml.cs类的一部分:
private static PrasanjaViewModel viewModel=null;
/// <summary>
/// A static ViewModel used by the views to bind against.
/// </summary>
/// <returns>The MainViewModel object.</returns>
public static PrasanjaViewModel ViewModel
{
get
{
// Delay creation of the view model until necessary
if (viewModel == null)
{
viewModel = new PrasanjaViewModel();
viewModel.LoadData();
}
return viewModel;
}
}
这是我的PrasanjaViewModel类中实现的LoadData()方法:
public void LoadData()
{
PrasanjaViewModel prasanje1 = GetPrasanje();
IsDataLoaded = true;
}
public PrasanjaViewModel GetPrasanje()
{
var prasanje = new PrasanjaViewModel();
SQLiteConnection db = new SQLiteConnection(App.DB_PATH);
var query = db.Table<Prasanja>().Where(x => x.id == 3);
var result = query.ToList();
foreach (var item in result)
{
prasanje.id = item.id;
prasanje.Tekst = item.Tekst;
}
return prasanje;
}
因此方法GetPrasanje()正确返回对象 prasanje 。并且 prasanje1 正确返回。但是当* 返回viewModel时 * 执行它返回NULL。我在这里找不到问题所在。
答案 0 :(得分:1)
简单修复:将LoadData()
方法的返回类型从void
更改为PrasanjaViewModel
,并将return prasanja1;
添加到该方法的末尾。这个问题是你要创建一个PasanjaViewModel实例,它用于创建 PrasanjaViewModel的另一个实例,而第二个实例(数据加载到其中)将被丢弃并且从未使用过。你还必须将你的getter中的行更改为viewModel = viewModel.LoadData();
,但是你要保留第二个实例并丢弃第一个实例!
我正在猜测你在尝试什么,但试试这个:
GetPrasanje()
方法设为静态。new PrasanjaViewModel()
,而是调用静态方法。LoadData()
方法,因为GetPrasanje()
正在加载。静态方法是一种“工厂”方法,它将为您创建一个包含数据的新viewmodel对象。
此外,在GetPrasanje()
方法结束时,您将遍历数据库查询结果,并将各行的值一次又一次地分配给prasanje.Id和prasanje.Tekst,每次覆盖你刚才分配的价值。这可能也不是你想要的。相反,PrasanjaViewModel应该具有某种类型的集合属性(如List<ResultItem> ResultItems
,其中ResultItem
是另一个包含数据库中某一行的类。)
另一方面,您似乎正在尝试从数据库中查询并获取单个行。在这种情况下,请在查询中添加.Single()
,然后摆脱foreach循环。
这是稍微修改过的代码:
private static PrasanjaViewModel viewModel=null;
/// <summary>
/// A static ViewModel used by the views to bind against.
/// </summary>
/// <returns>The MainViewModel object.</returns>
public static PrasanjaViewModel ViewModel
{
get
{
// Delay creation of the view model until necessary
if (viewModel == null)
{
viewModel = PresanjaViewModel.GetPresanje();
}
return viewModel;
}
}
和
public static PrasanjaViewModel GetPrasanje()
{
var prasanje = new PrasanjaViewModel();
SQLiteConnection db = new SQLiteConnection(App.DB_PATH);
var result = db.Table<Prasanja>().Where(x => x.id == 3).Single();
prasanje.id = result.id;
prasanje.Tekst = result.Tekst;
return prasanje;
}
我也很好奇Prasanja的含义...... :)