2017-06-27 4 views
0

Dois-je pouvoir transmettre un Tuple en tant que paramètre à OnNavigatedToAsync? Y a-t-il un meilleur moyen de transmettre ce type d'information?Tuple <ThisThing, bool> paramètre pour OnNavigatedToAsync dans le modèle 10

J'ai déjà essayé, mais je reçois toujours une exception d'incantation invalide dans la ligne Value = ci-dessous. La valeur est typée comme Tuple<ThisThing, bool>

ViewModel.cs:

public override async Task OnNavigatedToAsync(object parameter, NavigationMode mode, IDictionary<string, object> suspensionState) 
{ 
     Value = (Tuple<ThisThing, bool>)((suspensionState.ContainsKey(nameof(Value))) ? suspensionState[nameof(Value)] : parameter); 
} 

passage de paramètre en tant que Tuple.

public void GoToDetailsPage() => 
     NavigationService.Navigate(typeof(ThisThingPage), (new ThisThing() { Prop1=1, Prop2=2}, true)); 

Edit1: Je l'ai déjà essayé de simplifier cela

public override async Task OnNavigatedToAsync(object parameter, NavigationMode mode, IDictionary<string, object> suspensionState) 
{ 
    Value = (Tuple<ThisThing, bool>)parameter; 
} 

et quand le débogage et entrer dans OnNavigatedToAsync et planant au-dessus parameter je vois qu'il est ce que je pense, un Tuple, mais donne un InvalidCastException sur la ligne suivante.

+1

ne mettent pas tout en une seule ligne lors du débogage. vous pouvez avoir 'var x = suspensionState [nameof (Value)]' avec le débogueur, vous pouvez vérifier ce que 'x' est réellement. apparemment ce n'est pas un 'Tuple ' –

+0

Désolé. J'aurais dû mentionner que j'ai déjà fait quelque chose de similaire. Modification de l'article original –

+0

Il semble que «ValueTuple» ne soit pas un «Tuple». Creuser dans cela maintenant. –

Répondre

4

Le problème ici est que les tuples C# 7.0 ne sont pas System.Tuple, ils sont System.ValueTuple. Ainsi, le casting est correct:

Value = (ValueTuple<ThisThing, bool>)parameter; 

ou en utilisant la syntaxe tuple:

Value = ((ThisThing, bool))parameter; 
+0

Et si vous voulez que les éléments soient nommés: Value = ((ThisThing MyThing, bool MyBool)); –