簡體   English   中英

ViewModel方法不返回對象

[英]ViewModel method doesn't return object

我已經在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。 我在這里找不到問題所在。

簡單修復:將LoadData()方法的返回類型從void更改為PrasanjaViewModel ,並添加return prasanja1; 到該方法的結尾。 問題是您要創建一個PasanjaViewModel實例,該實例用於創建PrasanjaViewModel的另一個實例,而第二個實例(將數據加載到其中)將被丟棄並且從不使用。 您還必須將getter中的行更改為viewModel = viewModel.LoadData(); ,但是您將保留第二個實例並丟棄第一個實例!

我正在猜測您要嘗試什么,但是請嘗試以下操作:

  1. 使您的GetPrasanje()方法靜態。
  2. 而不是在您的getter中調用new PrasanjaViewModel() ,而是調用靜態方法。
  3. 刪除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是什么意思... :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM