【问题标题】:uwp GridView Drop EventTriggerBehavior signatureuwp GridView Drop EventTriggerBehavior 签名
【发布时间】:2017-07-22 13:18:42
【问题描述】:

我正在开发具有多个 ComboBox 和 GridView 的拖放 Xaml Uwp 应用程序。我在后面的 xaml 代码中对它进行了一些试验,直到我认为我知道我在使用该应用程序时要去哪里。然后我开始将我的逻辑转移到 ViewModel、PlayPageViewModel 中,我正在使用 MvvM Light 和 Template 10。我有许多使用交互的事件。当我将 Drop 移到我得到 Cannot find method named GvNewPlayList_OnDrop on object of type TheLolFx.UWP.T10.ViewModels.PlayPageViewModel that matches the expected signature.

的视图模型时,我已经在 codeBehind 中工作了 Drop

例外

        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

我使用了在后面的代码中生成的签名。 ContainerContentChanging在 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);
    }

【问题讨论】:

    标签: xaml uwp mvvm-light template10


    【解决方案1】:

    当使用CallMethodAction 调用方法时,方法的签名应该是这样的:public void DoSomthing()。异常原因如下:

    1. GvNewPlayList_OnDrop标记为private,需要标记为public

    2. 不能包含任何参数。

    所以只需像第二种方法那样修改它的签名:public async void GvLocalSoundsPlayListEditorContainerContentChangingAsync()

    【讨论】:

    • FacePalm!将其更改为公开。在我的机器上工作。此签名也适用于public async void GvNewPlayList_OnDrop(object sender, DragEventArgs e),让我可以访问发送者和 DragEventArgs。
    • 嗯,我明白了。 UWP 的 Behavior SDK 中方法不能带参数的约束已被移除。 see code here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多