Je développe un jeu d'applications Windows Store en utilisant winrt caliburn.micro em> 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? P> schématiquement, mes modèles de vue ressemblent actuellement à ceci: p> Idéalement, je voudrais appeler the initializescoreboard < / Code> Dans le
GameviewModel CODE> constructeur, mais aussi loin que j'ai pu dire qu'il n'est pas possible de passer la collection
setupgameviewmodel.players code> au
gameviewModel code> constructeur. p>
inavigageservice.navigateTeViewModel
[objet] code> 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 code> à partir de la méthode code> méthode code> soit, car le
gameviewModel code> n'a pas été initialisé à ce stade. p> p>
3 Réponses :
OK, il suffit de le mettre là-bas, et vous pouvez chaîner Quoi qu'il en soit, vous pouvez naviguer de cette façon. Ne comptez pas sur le constructeur cependant, il appellera puis dans le caliburn.micro code> a une navigation unifiée pour WP8 et WinRT:
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> Oninitialize code> et
OnActivate code>. Donc, juste pour le couper dans l'exemple: p>
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);
}
}
Merci beaucoup, c'était des informations extrêmement utiles, j'ai beaucoup appris de cette réponse. Comme vous soupçonnez cependant, la collection code> lecteurs code> ne semble pas être passable via avecparam code>. J'ai actuellement mis en place une solution très maladroite où je définis un gestionnaire local pour l'événement code> navigué code>. Les arguments de l'événement donnent au contenu de la navigation et je suppose implicitement que le
dataContext code> 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 i> ...
Merci pour cette réponse, ça m'a beaucoup aidé :)
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 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. p> mon et les très em> attaché temporairement pas vraiment la solution propre Je m'étais efforcée, mais au moins cela semble fonctionner. P> p> NavigateToviewmodel
setupgameviewModel.startgame code> est maintenant implémenté comme suit: p>
NAVIGATIONServiceSonnAvigated code> Le gestionnaire d'événements est implémenté comme suit: p>
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
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 // ... } ... }
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 code> dans l'exemple) doit être appelé
paramètre code> - semble être la convention.