2017-03-02 1 views
1

Je travaille sur une application de glisser-déposer Xaml Uwp avec plusieurs ComboBox et GridView. J'ai expérimenté avec un peu de code xaml jusqu'à ce que je pensais savoir où je me dirigeais avec l'application. J'ai alors commencé à déplacer ma logique dans un ViewModel, PlayPageViewModel, j'utilise MvvM Light et Template 10. J'ai beaucoup d'événements fonctionnant en utilisant des interactions. J'ai eu la chute de travail dans CodeBehind quand je le déplacer sur le modèle de vue, je me Cannot find method named GvNewPlayList_OnDrop on object of type TheLolFx.UWP.T10.ViewModels.PlayPageViewModel that matches the expected signature.uwp GridView Suppression de la signature EventTriggerBehavior

Exception

 Exception {System.ArgumentException: Cannot find method named GvNewPlayList_OnDrop on object of type TheLolFx.UWP.T10.ViewModels.PlayPageViewModel that matches the expected signature. 
     at Microsoft.Xaml.Interactions.Core.CallMethodAction.Execute(Object sender, Object parameter) 
     at Microsoft.Xaml.Interactivity.Interaction.ExecuteActions(Object sender, ActionCollection actions, Object parameter) 
     at Microsoft.Xaml.Interactions.Core.EventTriggerBehavior.OnEvent(Object sender, Object eventArgs)} System.Exception {System.ArgumentException} 

message

Message "System.ArgumentException: Cannot find method named GvNewPlayList_OnDrop on object of type TheLolFx.UWP.T10.ViewModels.PlayPageViewModel that matches the expected signature.\r\n at Microsoft.Xaml.Interactions.Core.CallMethodAction.Execute(Object sender, Object parameter)\r\n at Microsoft.Xaml.Interactivity.Interaction.ExecuteActions(Object sender, ActionCollection actions, Object parameter)\r\n at Microsoft.Xaml.Interactions.Core.EventTriggerBehavior.OnEvent(Object sender, Object eventArgs)" string 

je la signature qui a été généré dans la code derrière. Le ContainerContentChanging est tiré dans le ViewModel Comme vous pouvez le voir commenté, j'ai essayé avec juste l'objet aussi.

Quelle est la bonne signature?

XAML

<GridView x:Name="GvNewPlayList" 
         RelativePanel.Below="CbPlayListEditor" 
         Visibility="{Binding LbNewPlayListVisibility}" 
         Background="BurlyWood" 
         Padding="5" 
         Header="New Play List" 
         ItemsSource="{Binding NewLocalSoundsPlayListsSelectedItem.LocalSfxV2s}" 

         CanDragItems="True" 
         AllowDrop="True" 
         CanReorderItems="True" 
         IsItemClickEnabled="True" 
         DragItemsStarting="LbNewPlayList_OnDragItemsStarting" 

         DragOver="LbNewPlayList_OnDragOver">     
       <interactivity:Interaction.Behaviors> 
        <core:EventTriggerBehavior EventName="Drop"> 
         <core:CallMethodAction MethodName="GvNewPlayList_OnDrop" 
               TargetObject="{Binding Mode=OneWay}" /> 
        </core:EventTriggerBehavior> 

        <core:EventTriggerBehavior EventName="ContainerContentChanging"> 
         <core:CallMethodAction MethodName="GvLocalSoundsPlayListEditorContainerContentChangingAsync" 
               TargetObject="{Binding Mode=OneWay}" /> 
        </core:EventTriggerBehavior> 
       </interactivity:Interaction.Behaviors> 

       <GridView.ItemTemplate> 
        <DataTemplate> 
[...] 

PlayPageViewModel

Exception tiré sur XAML essayant de cibler cette méthode dans la machine virtuelle.

// private async void GvNewPlayList_OnDrop(object sender, object e) 
    // private async void GvNewPlayList_OnDrop() 

    private async void GvNewPlayList_OnDrop(object sender, DragEventArgs e) 
    { 
     e.AcceptedOperation = DataPackageOperation.Copy; 
     Logger.Log(this, "yup"); 
     [...] 
    } 

Celui-ci se déclenche à partir de l'événement ContainerContentChanging.

public async void GvLocalSoundsPlayListEditorContainerContentChangingAsync() 
    { 
     Logger.Log(this, $"GvLocalSoundsPlayListEditorContainerContentChangingAsync: {SelectedPlayList?.PlayListName}"); 
     //_settings.CurrentPlayList = SelectedPlayList; 
     //LocalSounds = await _theLolFxV2DataServices.GetPlayListAsync(SelectedPlayList); 
     //NewLocalSoundsPlayListItems = await _theLolFxV2DataServices.GetPlayListAsync(CbPlayListEditorSelectedItem); 
    } 

Répondre

1

Lorsque vous utilisez un CallMethodAction pour invoquer une méthode, la signature de la méthode devrait ressembler à ceci: public void DoSomthing(). Les raisons de l'exception sont:

  1. GvNewPlayList_OnDrop est marqué comme private, il faut marquer comme public;

  2. Il ne peut contenir aucun paramètre.

donc simplement modifier sa signature comme celle de la deuxième méthode: public async void GvLocalSoundsPlayListEditorContainerContentChangingAsync()

+0

FACEPALM! Changé au public. Fonctionne sur ma machine. Cette signature fonctionne également 'public async void GvNewPlayList_OnDrop (expéditeur d'objet, DragEventArgs e)' me donnant accès à l'expéditeur et au DragEventArgs. –

+0

Eh bien, je vois. La contrainte que cette méthode ne peut pas prendre des paramètres dans le SDK de comportement pour UWP a été supprimée. [voir le code ici] (https://github.com/Microsoft/XamlBehaviors/blob/master/src/BehaviorsSDKManaged/Microsoft.Xaml.Interactions/Core/CallMethodAction.cs) – WPInfo