0

我在 WP8 中实现了 MVVM,但是从 ViewModel 类调用方法时遇到问题,这是我的 App.xaml.cs 类的一部分,我从 ViewModel 类调用方法:

 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正确返回。但是当 * return viewModel *被执行时,它返回 NULL。我在这里找不到问题所在。

4

1 回答 1

1

简单修复:将LoadData()方法的返回类型从更改voidPrasanjaViewModel,并添加return prasanja1;到该方法的末尾。这样做的问题是您正在创建 PasanjaViewModel 的实例,该实例用于创建PrasanjaViewModel 的另一个实例,而第二个实例(数据加载到的位置)被丢弃并且从未使用过。您还必须将 getter 中的行更改为viewModel = viewModel.LoadData();,但随后您将保留第二个实例并丢弃第一个!

我在猜测你正在尝试什么,但试试这个:

  1. 使您的GetPrasanje()方法静态。
  2. 不要调用new PrasanjaViewModel()你的getter,而是调用静态方法。
  3. 删除该LoadData()方法,因为GetPrasanje()它会加载。

静态方法是一种“工厂”方法,它将使用数据为您创建一个新的视图模型对象。

此外,在您的GetPrasanje()方法结束时,您将迭代您的数据库查询结果,并一遍又一遍地将各个行的值分配给 prasanje.Id 和 prasanje.Tekst,每次都覆盖您刚刚分配的值。这可能也不是你想要的。相反,PrasanjaViewModel 应该具有某种类型的集合的属性(例如 a 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 是什么意思... :)

于 2013-08-05T00:33:00.153 回答