6

WinRT Caliburn.Microを使用して Windows ストア アプリ ゲームを開発しており、ナビゲーション フレームワークに依存しています。

ゲームのセットアップ (プレイヤーの定義) と実際のゲームのビュー モデルがあります。セットアップからゲームに移動するとき、プレイヤーのコレクションをゲーム ビュー モデルに渡したいと思います。これどうやってするの?

概略的には、私のビュー モデルは現在次のようになっています。

public class SetupGameViewModel : NavigationViewModelBase
{
    public SetupGameViewModel(INavigationService ns) : base(ns) { }

    public IObservableCollection<Player> Players { get; set; }

    public void StartGame()
    {
        // This is as far as I've got...
        base.NavigationService.NavigateToViewModel<GameViewModel>();

        // How can I pass the Players collection from here to the GameViewModel?
    }
}

public class GameViewModel : NavigationViewModelBase
{
    public GameViewModel(INavigationService ns) : base(ns) { }

    public ScoreBoardViewModel ScoreBoard { get; private set; }

    public void InitializeScoreBoard(IEnumerable<Player> players)
    {
        ScoreBoard = new ScoreBoardViewModel(players);
    }
}

InitializeScoreBoard理想的には、コンストラクター内から呼び出したいのですが、私がGameViewModel知る限り、SetupGameViewModel.PlayersコレクションをGameViewModelコンストラクターに渡すことはできません。

(INavigationService.NavigateToViewModel<T>拡張) メソッドはオプションで[object] parameter引数を取りますが、このパラメーターは移動先のビュー モデル コンストラクターに到達していないようです。また、この段階ではメソッドが初期化されていないため、GameViewModel.InitializeScoreBoardメソッドからメソッドを明示的に呼び出す方法もわかりません。SetupGameViewModel.StartGameGameViewModel

4

3 に答える 3

6

OK、それを公開するだけでCaliburn.Micro、WP8とWinRTのナビゲーションが統合されました。

NavigationService.UriFor<TargetViewModel>().WithParam(x => x.TargetProperty, ValueToPass).Navigate();

WithParamまた、複数のパラメーターをチェーンすることができます。現在、いくつかの制約があり、すべてのタイプが通過するわけではありません。その正確な理由はわかりませんが、WinRTでのナビゲーションの動作に何らかの影響があります。Caliburn.Microディスカッションセクションのどこかにそれについての言及がありました。

とにかく、あなたはこの方法でナビゲートすることができます。ただし、コンストラクターに依存しないでください。コンストラクターはとを呼び出しOnInitializeますOnActivate。だから、例にそれをカットするだけです:

NavigationService.UriFor<DetailsViewModel>().WithParam(x => x.Id, SelectedDetailsId).Navigate();

その後:でDetailsViewModel

protected override void OnInitialize()
{
    //Here you'll have Id property initialized to 'SelectedDetailsId' from the previous screen.
}

したがって、純粋な理論では、次のことができます。

NavigationService.UriFor<GameViewModel>().WithParam(x => x.Players, Players).Navigate();

セットアップで、次に:

public class GameViewModel
{
    public GameViewModel(INavigationService ns) : base(ns) 
    { 
       //It would probably be good to initialize Players here to avoid null
    }

    public ScoreBoardViewModel ScoreBoard { get; private set; }

    public IObservableCollection<Player> Players {get;set;}

    protected void OnInitialize()
    {
        //If everything goes as expected, Players should be populated now.
        ScoreBoard = new ScoreBoard(Players);
    }
}

しかし実際には、そのような複雑な構成(クラスのコレクションなど)を渡すことはうまくいくとは思いません。

より多くのプリミティブ型は問題なく機能します(int、などですが、たとえばstring、私にとっては機能しませんでした)。したがって、最悪のシナリオ/回避策は、たとえば、ナビゲーションとパスの前にリストを一時ファイルにシリアル化することです。で逆シリアル化する文字列としてのファイルパス。DateTimeURInullPlayersGameViewModel

SOをローミングするフレームワークにもっと関与している人々がいます。彼らはあなたにもっと価値のある洞察を与えるかもしれません。

于 2013-03-06T16:09:33.797 に答える