ViewModel方法不返回对象

时间:2013-08-04 22:14:07

标签: c# windows-phone-7 mvvm windows-phone-8

我已经在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。我在这里找不到问题所在。

1 个答案:

答案 0 :(得分:1)

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

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

  1. GetPrasanje()方法设为静态。
  2. 不要在getter中调用new PrasanjaViewModel(),而是调用静态方法。
  3. 删除LoadData()方法,因为GetPrasanje()正在加载。
  4. 静态方法是一种“工厂”方法,它将为您创建一个包含数据的新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的含义...... :)