2010-11-09 18 views
8

Je me demande si je peux créer un RelayCommand sur mes ViewModel comme ceci:Firing RelayCommand de CodeBehind lié à VM

public RelayCommand<IList<VectorViewModel>> MyCommand { get; set; } 

cteur:

MyCommand = new RelayCommand<IList<VectorViewModel>>(DoSomething); 

Et du Code derrière XAML, je reçois la lignes sélectionnées à partir d'un DataGrid et les mettre dans une liste.

if (xamDatagridVector.SelectedItems.Records.Count >= 3) 
{ 
       var list = new List<VectorViewModel>(); 
       foreach (DataRecord record in xamDatagridVector.SelectedItems.Records) 
       { 
        list.Add((VectorViewModel)record.DataItem); 
       } 
} 

A ce stade, je voudrais envoyer la liste Retour à la ViewModel en utilisant ce RelayCommand j'avais créé plus tôt. Serait-ce possible de créer un RelayCommand dans le code et le lier à la commande du ViewModel et l'éteindre?

Quelle alternative existe-t-il? Je pourrais bien sûr utiliser la classe Messenger faible-référencée dans MVVM-Light, mais quelque chose que je n'aime pas, c'est qu'il l'enverra à tous les abonnés de cet appel, et pas seulement le ViewModel sous-jacent (Son mortel en utilisant Messenger lorsque vous avez plusieurs les instances de la même vue dans les TabControls)

J'espère que quelqu'un a une idée de me maintenir, Merci beaucoup, Kave

Répondre

14

appellent simplement la méthode Execute de la commande après avoir vérifié le résultat de CanExecute:

var viewModel = (MyViewModel)DataContext; 
if (viewModel.MyCommand.CanExecute(list)) 
    viewModel.MyCommand.Execute(list); 
0

a nd si parfois le DataContext d'un élément ui diffère de la forme dans son ensemble, comme je l'ai rencontré, alors vous pouvez faire quelque chose comme ceci:

private void TextBoxTextChanged(object sender, TextChangedEventArgs e) 
    { 
     var binding = ((TextBox)sender).GetBindingExpression(TextBox.TextProperty); 
     binding.UpdateSource(); 

     var msg = String.Format("Migrator file selection updated to {0}", ((TextBox)sender).Text); 
     var rowControl = UiHelpers.FindVisualParent<UserControl>((DependencyObject)sender); // get the  FileNameSettingsRow UserControl 
     var form = UiHelpers.FindVisualParent<UserControl>((DependencyObject)rowControl); // get the main form it is used on 

     var viewModel = (UseCaseSettingsViewModel)form.DataContext; 

     if (viewModel.UpdateFileInCollectionCommand.CanExecute(((TextBox)sender).Text)) 
      viewModel.UpdateFileInCollectionCommand.Execute(((TextBox)sender).Text); 


     Messenger.Default.Send(new NotificationMessage(this, msg), Notifications.AppendSysMessageTextToken); 

     // Tell the UseCaseSettingsViewModel to force an update and reload 
     //Messenger.Default.Send(new NotificationMessage(this, ((TextBox)sender).Text), Notifications.FileSelectionChangedInternalToken); 
    } 

qui trouvera DataContext du UserControl sur lequel le UserControl subordonné existe , alors allez-y et faites des choses amusantes comme indiqué dans les réponses précédentes. Dans ce cas, l'édition d'une zone de texte sur le contrôle utilisateur subordonné nécessitait de dire au ViewModel global que le texte avait changé. Notez que FindVisualParent vient d'ici >>> https://stackoverflow.com/questions/636383/wpf-ways-to-find-controls