2010-06-18 2 views
2

Thre est quelque chose que je ne comprends pas. Si j'ai par exemple une page profile.xaml et que j'ai un ProfileViewModel avec une instance d'utilisateur. Comment est-ce que je dis le ProfileViewModel avec une propriété d'utilisateur pour charger l'utilisateur avec un id que je veux?passer l'ID spécifique à MVVM

Je veux dire: Comment est-ce que je passe un userid au profileviewmodel quand je clique sur un bouton dans une autre page pour ouvrir cette page?

Par exemple

Userlist.xaml a une liste d'utilisateurs. Un est cliqué et une instance de Profile.Xaml est chargée, mais comment je passe l'userId sur le viewmodel? N'aurai-je pas besoin de dependencyproperty dans profile.xaml et ensuite le transmettre?

S'il vous plaît me dire si cela a un sens pour vous :)

Répondre

2

Vous devez envisager de lier votre liste d'utilisateurs dans Userlist.xaml à une collection d'instances ProfileViewModel, puis vous pouvez simplement fournir le ProfileViewModel spécifique à profile.xaml.

Dans cet exemple, votre Userlist.xaml comprendrait:

<UserControl Name="userView"> 
    <!-- other stuff --> 
    <ItemsControl ItemsSource={Binding Users}> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <TextBlock Text="{Binding UserName}" /> 
        <Button Content="View User Profile" 
        Command="{Binding ElementName=userView, Path=DataContext.ViewUserProfileCommand}" 
        CommandParameter="{Binding}" /> 
       </StackPanel> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
    <!-- other stuff --> 
</UserControl> 

Et votre UserlistViewModel comprendrait:

#region Users Property 

    public const string UsersPropertyName = "Users"; 

    private ObservableCollection<IProfileViewModelViewModel> _users; 

    public ObservableCollection<IProfileViewModelViewModel> Users 
    { 
     get { return _users; } 
     set 
     { 
      if (_users == value) 
       return; 

      _users = value; 
      RaisePropertyChanged(UsersPropertyName); 
     } 
    } 

    #endregion 

    public RelayCommand<IProfileViewModel> ViewUserProfileCommand 
     = new RelayCommand<IProfileViewModel>(ViewUserProfileCommandExecute); 

    private void ViewUserProfileCommandExecute(IUserProfileViewModel userProfileViewModel) 
    { 
     // display your profile view here 
    } 

Comme Reed mentionné ci-dessus, une façon de passer le modèle de profil de l'utilisateur en vue de votre autre page serait MVVM Light Toolkit's messaging.

2

Il y a plusieurs options, ici. Si vous travaillez à l'intérieur d'un ViewModel "parent", vous pouvez potentiellement construire un nouveau ProfileViewModel avec l'ID utilisateur spécifique, et le définir sur une propriété qui est directement captée par votre View. C'est l'approche que j'ai utilisée dans mon MVVM article. Alternativement, si vous avez un seul ProfileViewModel (et ProfileView) et qu'il n'est pas "connecté" à l'écran/vue où vous choisissez directement l'utilisateur, la meilleure option est généralement d'utiliser un service de messagerie. C'est l'approche MVVM Light utilise.

Questions connexes