0

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はきちんと返されます。しかし、* return viewModel *が実行されると、NULL が返されます。ここで問題がどこにあるのかわかりません。

4

1 に答える 1

1

簡単な修正: メソッドの戻り値の型をLoadData()からvoidに変更し、そのメソッドの末尾にPrasanjaViewModel追加します。これに関する問題は、PrasanjaViewModelの別のreturn prasanja1;インスタンスを作成するために使用される PasanjaViewModel のインスタンスを作成していて、2 番目のインスタンス (データが読み込まれる場所) が破棄され、使用されないことです。また、ゲッターの行を に変更する必要がありますが、2 番目のインスタンスを保持して最初のインスタンスを破棄することになります。viewModel = viewModel.LoadData();

私はあなたが何をしようとしているのか推測していますが、これを試してください:

  1. メソッドをGetPrasanje()静的にします。
  2. new PrasanjaViewModel()ゲッターを呼び出す代わりに、静的メソッドを呼び出します。
  3. がロードを行うLoadData()ため、メソッドを削除します。GetPrasanje()

静的メソッドは、データを使用して新しいビューモデル オブジェクトを作成する「ファクトリ」メソッドです。

また、GetPrasanje()メソッドの最後で、データベース クエリの結果を繰り返し処理し、さまざまな行の値を prasanje.Id と prasanje.Tekst に何度も割り当て、そのたびに割り当てたばかりの値を上書きします。これもおそらくあなたが望むものではありません。代わりに、PrasanjaViewModel には、何らかのタイプのコレクションであるプロパティが必要です ( はList<ResultItem> ResultItemsResultItemデータベースからの行の 1 つを保持する別のクラスです)。

一方、データベースから単一の行を照会して取得しようとしているようです。この場合、.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 に答える