2013-08-04 43 views
0

我已經在WP8中實現了MVVM,但是我的ViewModel類調用方法有問題,這裏是我從我的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; 
     } 
    } 

這裏是實現LoadData從我PrasanjaViewModel類()方法:

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被正確地返回。但是當* 返回視圖模型 *被執行時,它返回NULL。我找不到問題在哪裏。

回答

1

簡單的解決方法:更改LoadData()方法的返回類型從voidPrasanjaViewModel,並添加return prasanja1;該方法的末尾。問題在於你正在創建一個PasanjaViewModel實例,該實例用於創建另一個 PrasanjaViewModel的實例,而第二個實例(將數據加載到此實例中)將被丟棄並且從不使用。你也必須將你的吸氣線改爲viewModel = viewModel.LoadData();,但是你保留第二個實例並丟棄第一個!

我在你試圖做什麼猜測,但試試這個:

  1. 讓您GetPrasanje()方法是靜態的。
  2. 而不是在您的getter中調用new PrasanjaViewModel(),調用靜態方法。
  3. 刪除LoadData()方法,因爲GetPrasanje()進行加載。

靜態方法是一種「工廠」方法,它將爲您創建一個具有數據的新視圖模型對象。

另外,在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意味着... :)