如何解决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绑定到数据。
注意:
升级到Behaviors.Forms 1.4会生成一个设计时错误。
更新:
这是我对贡献者提出的建议的最新动态...
- “在主单元格对象上轻按手势”选项不会触发任何事件
- 引发“选择的项目”事件...但未调用“ 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来获取命令行为的事件
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。