2010-05-21 4 views
3

exemple grille avec la gâchette:Comment envoyer le LayoutRoot dans une RelayCommand via un EventToCommand?

<Grid x:Name="LayoutRoot" DataContext="{Binding ProjectGrid, Source={StaticResource Locator}}"> 
<i:Interaction.Triggers> 
    <i:EventTrigger EventName="Loaded"> 
    <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding LoadedCommand, Mode=OneWay}" PassEventArgsToCommand="True"/> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

Dans mon ViewModel je mis la LoadedCommand comme ceci:

public RelayCommand<RoutedEventArgs> LoadedCommand {get;private set;} 

Et dans le initialiseur ViewModel je ceci:

public ProjectGridViewModel() 
{ 
    LoadedCommand = new RelayCommand<RoutedEventArgs>(e => 
    { 
     this.DoLoaded(e); 
    } 
); 
} 

Puis, dans mon DoLoaded je suis en train de le faire:

Grid _projectGrid = null; 
public void DoLoaded(RoutedEventArgs e) 
{ 
    _projectGrid = e.OriginalSource as Grid; 
} 

Vous pouvez voir que je suis en train de se débarrasser de mon Loaded = « » dans ma grille à mon avis, et faire une place RelayCommand . Le problème est que OriginalSource ne rapporte rien. Mon événement chargé fonctionne bien de cette façon, mais j'ai besoin d'obtenir la grille via le RoutedEventArgs il semble.

J'ai essayé de passer dans la grille dans la commande EventCommand avec CommandParameter = "{Binding ElementName = LayoutRoot}", mais cela bloque VS2010 lorsque vous appuyez sur F5 et exécutez le projet.

Des idées? Ou une meilleure façon de le faire? J'ai fait exécuter l'événement Loaded dans les vues C#, puis appeler le ViewModel dans le code derrière les vues, mais je voudrais faire une liaison plus agréable. Parler à ViewMode dans le code-behind de Views se sent comme un hack.

Répondre

4

Vous pouvez essayer de lier le CommandParameter du EventToCommand:

<GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding LoadedCommand, Mode=OneWay}" CommandParameter="{Binding ElementName=LayoutRoot}" PassEventArgsToCommand="True"/> 

Ensuite, votre code sera:

public RelayCommand<UIElement> LoadedCommand {get;private set;} 

public ProjectGridViewModel() 
{ 
    LoadedCommand = new RelayCommand<UIElement>(e => 
    { 
     this.DoLoaded(e); 
    } 
); 
} 

Grid _projectGrid = null; 
public void DoLoaded(UIElement e) 
{ 
    _projectGrid = e; 
} 

Il devrait fonctionner correctement :)

Bye.

+0

C'est ce qu'il a fait. Thx bourgeon ... sauveteur :) Je suis sûr que d'autres le voudront aussi, ne trouvent rien là-dessus pendant la recherche sur le web. – user298145

Questions connexes