6
votes

Comment transmettre le paramètre sur le modèle de vue navigué avec Winrt caliburn.micro?

Je développe un jeu d'applications Windows Store en utilisant winrt caliburn.micro et je m'appuie sur le cadre de navigation.

J'ai voir les modèles pour la configuration de jeu (définir les joueurs) et le Jeu réel. Lors de la navigation de la configuration du jeu, je souhaite transmettre la collection de joueurs au modèle de visualisation du jeu. Comment puis-je faire cela?

schématiquement, mes modèles de vue ressemblent actuellement à ceci: xxx

Idéalement, je voudrais appeler initializescoreboard < / Code> Dans le GameviewModel constructeur, mais aussi loin que j'ai pu dire qu'il n'est pas possible de passer la collection setupgameviewmodel.players au gameviewModel constructeur.

the inavigageservice.navigateTeViewModel (extension) prend éventuellement un paramètre [objet] argument, mais ce paramètre ne semble pas atteindre le constructeur de modèle de vue navigué à. Et je ne peux pas comprendre comment appeler explicitement l'appel gameviewmodel.initializescoreboard à partir de la méthode méthode soit, car le gameviewModel n'a pas été initialisé à ce stade.


0 commentaires

3 Réponses :


6
votes

OK, il suffit de le mettre là-bas, caliburn.micro code> a une navigation unifiée pour WP8 et WinRT: xxx pré>

et vous pouvez chaîner avecparam code> pour plusieurs paramètres. Maintenant, il y a quelques contraintes, pas tous les types passés, je ne suis pas tout à fait sûr de la raison exacte de cela, mais il a quelque chose à faire comment la navigation fonctionne à WinRT. Il y avait une mention quelque part dans caliburn.micro code> section de discussion . P>

Quoi qu'il en soit, vous pouvez naviguer de cette façon. Ne comptez pas sur le constructeur cependant, il appellera Oninitialize code> et OnActivate code>. Donc, juste pour le couper dans l'exemple: p> xxx pré>

puis dans le DétailsViewModel code>: p>

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);
    }
}


4 commentaires

Merci beaucoup, c'était des informations extrêmement utiles, j'ai beaucoup appris de cette réponse. Comme vous soupçonnez cependant, la collection lecteurs ne semble pas être passable via avecparam . J'ai actuellement mis en place une solution très maladroite où je définis un gestionnaire local pour l'événement navigué . Les arguments de l'événement donnent au contenu de la navigation et je suppose implicitement que le dataContext est mon modèle de vue. Pourtant, ce serait bien si quelqu'un a une solution plus fiable disponible pour ce problème.


BTW, je pense avoir trouvé la discussion que vous faisiez référence à, ici .


@Andersgustafsson Yep, c'est exactement cette discussion. Comme je l'ai dit, je ne connais pas vraiment une meilleure solution pour le moment avec Caliburn.Micro à part de sauvegarder les données quelque part, puis de le reconstituer à partir d'une sorte de clé; de ladite discussion - Même Microsoft décourage-le , Mais c'est généralement pris en charge ...


Merci pour cette réponse, ça m'a beaucoup aidé :)



4
votes

En fin de compte, j'ai résolu ceci en mettant en œuvre un gestionnaire d'événements temporaires. Il s'est avéré que je pourrais utiliser le NavigateToviewmodel (objet) surcharge pour transmettre la collection de joueurs.

du Forum de discussion de Caliburn Micro et Documentation MSDN J'ai l'impression que cette approche n'est garantie que de travailler pour des types" primitifs ", bien que dans Mon scénario que j'ai jusqu'à présent n'a pas détecté aucun problème de problème.

mon setupgameviewModel.startgame est maintenant implémenté comme suit: xxx

et les très attaché temporairement NAVIGATIONServiceSonnAvigated Le gestionnaire d'événements est implémenté comme suit: xxx

pas vraiment la solution propre Je m'étais efforcée, mais au moins cela semble fonctionner.


2 commentaires

Merci pour cela, cela m'a sauvé beaucoup de mon temps.


Dans ce poste de Rob lui-même, il explique qu'il est dû au système de navigation dans Windows Phone qui fonctionne sur la base de l'URI qui ne soutenait pas la désérialisation complexe. caliburnmicro.codeplex.com/discussions/267562



2
votes

Dans Win Store Apps, vous pouvez remettre des objets complexes entre les images de vue avec l'aide du service de navigation. Seulement dans les applications Silverlight, vous êtes limité aux objets qui doivent être sérialisables à une chaîne. Cette restriction n'existe pas dans les applications Win Store.

Dans votre cas, quelque chose comme ce qui suit devrait fonctionner. Dans statgame (), le navigagerservice est utilisé pour appeler le jeuviewModel. La liste des joueurs est remise en tant que paramètre simple. Par convention Ce paramètre sera attribué à un paramètre de propriété de la fenêtre de destinationModel. P>

public class SetupGameViewModel : Screen 
{
    private readonly INavigationService _navigationService;

    public MainPageViewModel(INavigationService navigationService)
    {
        _navigationService = navigationService;
    }

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

    public void StartGame() 
    {
        _navigationService.NavigateToViewModel<GameViewModel>(Players);
    }

    ...
}


public class GameViewModel : Screen
{   
    private IObservableCollection<Player> _parameter;

    public IObservableCollection<Player> Parameter
    {
        get { return _parameter; }
        set
        {
            if (value.Equals(_parameter)) return;
            _parameter = value;
            NotifyOfPropertyChange(() => Parameter);
        }
    }

    protected override void OnActivate()
    {
        // do something with the player list
        // ...
    }

    ...
}


1 commentaires

Merci, c'est la réponse de mon application Windows 10 UWP. Et oui, la propriété dans le modèle de visualisation de la destination ( gameviewModel dans l'exemple) doit être appelé paramètre - semble être la convention.