uwp GridView Drop EventTriggerBehavior подпись

Я работаю над приложением Drag and Drop Xaml Uwp с несколькими ComboBox и GridView. Я немного поэкспериментировал с ним в коде xaml, пока не подумал, что знаю, куда иду с приложением. Затем я начал перемещать свою логику в ViewModel, PlayPageViewModel, я использую MvvM Light и Template 10. У меня много событий, работающих с использованием взаимодействий. У меня был Drop, работающий в codeBehind, когда я перемещаю его в модель представления, я получаю Cannot find method named GvNewPlayList_OnDrop on object of type TheLolFx.UWP.T10.ViewModels.PlayPageViewModel that matches the expected signature.

Исключение

        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 "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

Я использовал подпись, которая была сгенерирована в коде позади. ContainerContentChangingis запускается в ViewModel. Как вы можете видеть в комментариях, я тоже пытался использовать только объект.

Какая правильная подпись?

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

Исключение, вызванное XAML, пытающимся настроить таргетинг на этот метод в vm.

    // 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");
        [...]
    }

Этот срабатывает из события ContainerContentChanging.

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

person Jeff Albrecht    schedule 02.03.2017    source источник


Ответы (1)


При использовании CallMethodAction для вызова метод, сигнатура метода должна быть такой: public void DoSomthing(). Причины исключения:

  1. GvNewPlayList_OnDrop помечен как private, его нужно пометить как public;

  2. Он не может содержать никаких параметров.

Поэтому просто измените его подпись, как во втором методе: public async void GvLocalSoundsPlayListEditorContainerContentChangingAsync()

person WPInfo    schedule 03.03.2017
comment
ФейсПалм! Изменил на общедоступный. Работает на моей машине. Эта подпись также работает public async void GvNewPlayList_OnDrop(object sender, DragEventArgs e), предоставляя мне доступ к отправителю и DragEventArgs. - person Jeff Albrecht; 03.03.2017
comment
Ну, я вижу. Ограничение, согласно которому метод не может принимать параметры в Behavior SDK для UWP, было удалено. см. код здесь - person WPInfo; 03.03.2017