Behaviors.Forms命令未执行

问题描述

我正在尝试将现有的Xamarin项目升级到各种库的最新版本。 Xamarin本身位于共享库中。我的页面上有一个ListView,我正在尝试捕获“选择”某项时触发的事件。但是,我的viewmodel中的ICommand没有执行。

注意:

  • 我正在使用Xamarin.Forms 4.8 ...,但由于代码位于.NET Standard库中,因此不得不将Behaviors.Forms降级为1.3。
  • 如果我升级到Behaviors.Forms 1.4,则会发生设计时错误(请参见下图)

共享库信息:
.NET Standard 2.0

  • Acr.UserDialogs版本=“ 7.1.0.454”
  • AzureMobileClient.Helpers版本=“ 4.0.2.507-pre”
  • Behaviors.Forms版本=“ 1.3.0”
  • Com.Airbnb.Xamarin.Forms.Lottie Version =“ 3.1.3”
  • Prism.DryIoc.Forms版本=“ 8.0.0.1850-pre”
  • Prism.Forms版本=“ 8.0.0.1850-pre”
  • Refractored.MvvmHelpers版本=“ 1.6.2”
  • Telerik.UI.for.Xamarin.Common Version =“ 2020.2.624.1”
  • Telerik.UI.for.Xamarin.DataControls版本=“ 2020.2.624.1”
  • Telerik.UI.for.Xamarin.DataGrid版本=“ 2020.2.624.1”
  • Telerik.UI.for.Xamarin.Primitives版本=“ 2020.2.624.1”
  • Telerik.UI.for.Xamarin.SkiaSharp版本=“ 2020.2.624.1”
  • Xamarin.FFImageLoading.Forms Version =“ 2.4.11.982”
  • Xamarin.FFImageLoading.Svg.Forms Version =“ 2.4.11.982”
  • Xamarin.FFImageLoading.Transformations Version =“ 2.4.11.982”
  • Xamarin.Forms Version =“ 4.8.0.1364”

转换器类别:
原始程序员返回“ ItemTapped” EventArgs ...

public class SelectedItemEventArgsConverter : IValueConverter
{
    #region <Methods>

    public object Convert(object value,Type targettype,object parameter,CultureInfo culture)
    {
        var eventArgs = value as ItemTappedEventArgs;
        return eventArgs != null ? eventArgs.Item : null;
    }

    public object ConvertBack(object value,CultureInfo culture)
    {
        throw new NotImplementedException();
    } 

    #endregion
}

查看模型:
ListView绑定并显示项目(请参见下面的照片)...

using CustomControls;
using Models;
using MvvmHelpers.Commands;
using Prism.Navigation;
using Prism.Services;
using System.Collections.Generic;

public class MainPageviewmodel : viewmodelBase
{
    #region Constructors

    public MainPageviewmodel(INavigationService navigationService,IPageDialogService pageDialogService,IDeviceService deviceService) : base(navigationService,pageDialogService,deviceService)
    {
        Initialize();
    }

    #endregion

    #region <Properties>

    public AccordionNode ShakeoutListItemsAccordion { get; private set; }

    public Command<SimpleListItem> OnShakeoutListItemSelectedCommand { get; private set; }

    public List<SimpleListItem> ShakeoutListItems { get; private set; } = new List<SimpleListItem>();

    #endregion

    #region <Events>

    public async void OnShakeoutListItemSelected(SimpleListItem item)
    {
        if (item.Name == "Add Shakeout")
            await NavigationService.NavigateAsync("ShakeoutDocumentGeneratorPage");
    }

    #endregion

    private void Initialize()
    {
        // Commands
        OnShakeoutListItemSelectedCommand = new Command<SimpleListItem>(OnShakeoutListItemSelected);

        // Accordians
        ShakeoutListItemsAccordion = new AccordionNode("OverwrittenInView",GlobalVariables.Accordion.Height,GlobalVariables.Accordion.HeaderBackgroundColor,GlobalVariables.Accordion.HeaderColorTextColor,GlobalVariables.Accordion.SeparatorColor);

        // Data
        ShakeoutListItems.Add(new SimpleListItem { Name = "Add Shakeout",Title = string.Empty,Type = string.Empty });
    }
}

查看:
由于转换器类的“ ItemTapped” EventArgs,我将重点放在该事件上……但是我可以接受(如果需要)

<?xml version="1.0" encoding="utf-8" ?>
<views:BaseContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             xmlns:behaviors="clr-namespace:Behaviors;assembly=Behaviors"
             xmlns:forms="clr-namespace:FFImageLoading.Svg.Forms;assembly=FFImageLoading.Svg.Forms"
             xmlns:converters="clr-namespace:ETC.Operations.pulse.Mobile.Converters;assembly=ETC.Operations.pulse.Mobile"
             xmlns:customControls="clr-namespace:ETC.Operations.pulse.Mobile.CustomControls;assembly=ETC.Operations.pulse.Mobile"
             xmlns:helpers="clr-namespace:ETC.Operations.pulse.Mobile.Helpers;assembly=ETC.Operations.pulse.Mobile"
             xmlns:views="clr-namespace:ETC.Operations.pulse.Mobile.Views;assembly=ETC.Operations.pulse.Mobile"
             x:Class="ETC.Operations.pulse.Mobile.MainPage">
    <ContentPage.Resources>
        <ResourceDictionary>
            <converters:SelectedItemEventArgsConverter x:Key="EventToCommand"/>
            <forms:SvgImageSourceConverter x:Key="SvgImageSourceConverter"></forms:SvgImageSourceConverter>
        </ResourceDictionary>
    </ContentPage.Resources>

    <ContentPage.Content>
        <ScrollView  VerticalOptions="FillAndExpand" Padding="10">
            <StackLayout Spacing="0" Padding="0">

                <!-- SHAKEOUTS -->
                <StackLayout Spacing="0" Padding="0"  Style="{DynamicResource AccordionTitleStyle}">
                    <StackLayout Style="{DynamicResource AccordionHeaderStackLayoutStyle}">
                        <StackLayout.GestureRecognizers>
                            <TapGestureRecognizer Command="{Binding ShakeoutListItemsAccordion.ExpandContractAccordion}"/>
                        </StackLayout.GestureRecognizers>
                        <Label Text="Shakeouts" Style="{DynamicResource AccordionHeaderTextStyle}" VerticalTextAlignment="Center"/>
                        <Label TextColor="{Binding ShakeoutListItemsAccordion.HeaderTextColor}"  HorizontalOptions="EndAndExpand" Text="{Binding ShakeoutListItemsAccordion.IconText}" VerticalTextAlignment="Center"/>
                    </StackLayout>
                    <BoxView HeightRequest="1" Color="{Binding ShakeoutListItemsAccordion.LineColor}" HorizontalOptions="FillAndExpand"></BoxView>
                </StackLayout>

                <!-- SHAKEOUTS: Controls -->
                <StackLayout BackgroundColor="{DynamicResource BackgroundColor}" HeightRequest="200" IsVisible="{Binding ShakeoutListItemsAccordion.IsExpanded}" Padding="0" Spacing="0">
                    <ListView
                        x:Name="lvShakeoutListItems"
                        HorizontalOptions="FillAndExpand"
                        VerticalOptions="FillAndExpand"
                        ItemsSource="{Binding ShakeoutListItems}"
                        RowHeight="40">
                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <ViewCell>
                                    <Grid Style="{DynamicResource ListViewGridItemStyle}" RowSpacing="0" ColumnSpacing="0" Margin="13,0">
                                        <Grid.RowDeFinitions>
                                            <RowDeFinition Height="Auto"/>
                                            <RowDeFinition Height="Auto"/>
                                        </Grid.RowDeFinitions>
                                        <Grid.ColumnDeFinitions>
                                            <ColumnDeFinition Width="0.8*" />
                                            <ColumnDeFinition Width="150" />
                                        </Grid.ColumnDeFinitions>

                                        <Label Grid.Row="0" Grid.Column="0"  Text="{Binding Name}" Style="{DynamicResource ListViewLabelCenterRowLeft}" TextColor="{StaticResource LabelValueTextColor}" Margin="0,10,0"/>
                                    </Grid>
                                </ViewCell>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                        <ListView.Behaviors>
                            <behaviors:EventHandlerBehavior EventName="ItemTapped">
                                <behaviors:InvokeCommandAction Command="{Binding OnShakeoutListItemSelectedCommand}" Converter="{StaticResource EventToCommand}" />
                            </behaviors:EventHandlerBehavior>
                        </ListView.Behaviors>
                    </ListView>
                </StackLayout>
            </StackLayout>
        </ScrollView>
    </ContentPage.Content>
</views:BaseContentPage>

电话图像:
如您所见... viewmodel绑定到数据。

enter image description here

注意:
升级到Behaviors.Forms 1.4会生成一个设计时错误

enter image description here

更新
这是我对贡献者提出的建议的最新动态...

  • “在主单元格对象上轻按手势”选项不会触发任何事件
  • 引发“选择的项目”事件...但未调用“ MainPageviewmodel OnShakeoutListItemSelected”事件
  • 我目前正在看NuGet中的“ Corcav行为”

解决方法

选项1 :对主单元格对象使用轻击手势

<ListView
                        x:Name="lvShakeoutListItems"
                        HorizontalOptions="FillAndExpand"
                        VerticalOptions="FillAndExpand"
                        ItemsSource="{Binding ShakeoutListItems}"
                        RowHeight="40">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <Grid Style="{DynamicResource ListViewGridItemStyle}" RowSpacing="0" ColumnSpacing="0" Margin="13,0">
                            **<Grid.GestureRecognizers>
                                <TapGestureRecognizer Command="{Binding OnShakeoutListItemSelectedCommand}" CommandParameter="{Binding .}"/>
                            </Grid.GestureRecognizers>**
                            <Grid.RowDefinitions>
                                <RowDefinition Height="Auto"/>
                                <RowDefinition Height="Auto"/>
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="0.8*" />
                                <ColumnDefinition Width="150" />
                            </Grid.ColumnDefinitions>

                            <Label Grid.Row="0" Grid.Column="0"  Text="{Binding Name}" Style="{DynamicResource ListViewLabelCenterRowLeft}" TextColor="{StaticResource LabelValueTextColor}" Margin="0,10,0"/>
                        </Grid>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

选项2 :在主单元格对象上使用选定的项

<ListView
                        x:Name="lvShakeoutListItems"
                        HorizontalOptions="FillAndExpand"
                        VerticalOptions="FillAndExpand"
                        ItemsSource="{Binding ShakeoutListItems}"
            SelectedItem="{Binding SelctedItem}"
                        RowHeight="40">
...
</>

选项3 :使用corcav行为nuget来获取命令行为的事件