2012-11-22 2 views
1

J'ai une commande sur un ViewModel que j'utiliser pour accéder à une page de détailsException lors de l'envoi des paramètres de VM à VM sur l'appareil avec MvvmCross sur WP7.1

public class InstalledMetersListViewModel : MvxViewModel 
    , IMvxServiceConsumer<IInstallMeterRepository> 
{ 
    public List<InstalledMeterListItemViewModel> List { get; set; } 

    public InstalledMetersListViewModel() 
    { 
     List = new List<InstalledMeterListItemViewModel>(); 
     foreach (var meter in this.GetService<IInstallMeterRepository>().GetInstalledMeters()) 
     { 
      List.Add(new InstalledMeterListItemViewModel { Serial = meter.Serial, Description = meter.Description }); 
     } 
    } 

    public IMvxCommand ShowDetailsCommand 
    { 
     get 
     { 
      return new MvxRelayCommand<InstalledMeterListItemViewModel>(type => RequestNavigate<InstalledMeterListItemViewModel>(new {serial = type.Serial.ToString()})); 
     } 
    } 
} 

ce point de vue

<ListBox ItemsSource="{Binding List}" x:Name="TheListBox"> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter> 
     </Style> 
    </ListBox.ItemContainerStyle> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Border BorderThickness="5,5,5,5" BorderBrush="White"> 
       <Grid Width="auto" HorizontalAlignment="Stretch" > 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="Auto"/> 
         <ColumnDefinition Width="Auto"/> 
         <ColumnDefinition Width="1*"/> 
         <ColumnDefinition Width="Auto"/> 
        </Grid.ColumnDefinitions> 
        <Grid.RowDefinitions> 
         <RowDefinition /> 
         <RowDefinition /> 
        </Grid.RowDefinitions> 

        <TextBlock Text="S/N"/> 
        <TextBlock Text=" : " Grid.Column="1"/> 
        <TextBlock Text="{Binding Serial}" Grid.Column="2"/> 

        <TextBlock Text="Description" Grid.Row="1"/> 
        <TextBlock Text=" : " Grid.Column="1" Grid.Row="1"/> 
        <TextBlock Text="{Binding Description}" Grid.Column="2" Grid.Row="1"/> 

        <Button Content="Details" Grid.Column="3" Grid.RowSpan="2" Command="{Binding Path=DataContext.ShowDetailsCommand, ElementName=TheListBox}" CommandParameter="{Binding}"/> 
       </Grid> 
      </Border> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

Le ViewModel Je navigue à se

public class InstalledMeterListItemViewModel : MvxViewModel, 
    IMvxServiceConsumer<IInstallMeterRepository> 
{ 

    public InstalledMeterListItemViewModel(string serial) 
    { 
     IInstalledMeter meter = this.GetService<IInstallMeterRepository>().GetMeter(Convert.ToDouble(serial)); 
     Description = meter.Description; 
     Serial = meter.Serial; 
    } 

    public InstalledMeterListItemViewModel() 
    { 

    } 

problème acce objet ssing - très probablement cela est causé par un objet anonyme étant généré en interne - s'il vous plaît voir Anonymous types and Get accessors on WP7.1?

Mais je n'utiliser toutes les classes internes, donc je ne peux pas voir comment je peux résoudre ce problème

+0

Je suis vraiment surpris ce court sur l'émulateur - je ne pense pas utilisé pour ... – Stuart

+0

Cest mon mauvais, ça ne marche pas, j'utilisais l'émulateur WP8 et quand je l'ai découvert je l'ai seulement enlevé du titre, éditant maintenant – Mech0z

Répondre

1

Cette ligne:

return new MvxRelayCommand<InstalledMeterListItemViewModel>(
     vm => RequestNavigate<InstalledMeterListItemViewModel>(
       new {serial = type.Serial.ToString()})); 

crée une instance d'une classe anonyme

Cette classe anonyme est généré par le compilateur (utiliser un outil comme réflecteur pour le voir)

Le compilateur génère comme internal

-à-dire le compilateur créer une classe un peu comme

internal class Anonymous_Mangled_Name_1223345tHER 
{ 
    public string serial { get; set; } 
} 

et réécrit ensuite votre code comme:

return new MvxRelayCommand<InstalledMeterListItemViewModel>(
     vm => RequestNavigate<InstalledMeterListItemViewModel>(
       new Anonymous_Mangled_Name_1223345tHER 
       { 
        serial = type.Serial.ToString() 
       })); 

Pour refléter et utiliser cette classe, le code dans Cirrious.MvvmCross doit y avoir accès ...

Voilà pourquoi vous avez besoin InternalsVisibleTo-http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.aspx

Voir la dernière ligne de Conference-AssemblyInfo.cs pour un exemple de la ligne à ajouter.

[assembly: InternalsVisibleTo("Cirrious.MvvmCross")] 

Note: pour l'ancienne branche « maître », c'est:

[assembly: InternalsVisibleTo("Cirrious.MvvmCross.WindowsPhone")] 
// should really also add Cirrious.MvvmCross.Touch - but mono runtime doesn't care 
// should really also add Cirrious.MvvmCross.Droid - but mono runtime doesn't care 
+0

Ajout de [assembly: InternalsVisibleTo ("Cirrious.MvvmCross")] à mon projet UI et Core WP7 pas réparer l'erreur, il est toujours levé – Mech0z

+0

Prenez-le pour discuter? http://jabbr.net/#/rooms/mvvmcross – Stuart

+1

L'utilisation de [assembly: InternalsVisibleTo ("Cirrious.MvvmCross.WindowsPhone")] a fonctionné en raison de moi en cours d'exécution Maître et non Vnext – Mech0z