使用 Prism Xamarin 表单创建动态 TabbedPage

Posted

技术标签:

【中文标题】使用 Prism Xamarin 表单创建动态 TabbedPage【英文标题】:Creating Dynamic TabbedPage using Prism Xamarin forms 【发布时间】:2019-07-07 06:22:16 【问题描述】:

我正在将 Prism 与项目源一起使用,在每个选项卡式页面内都有一个 Listview,我无法将“ItemTapped”事件用作命令行为的事件,以在点击 listview 项目时触发 viewmodel 中的命令,但是当我点击列表视图项时,在调试模式下没有触发器,请帮助我理解为什么会发生这种情况,是否有任何替代方式可以使用命令。此外,当我检查事件在 PrismTabbedPage1.xaml.cs 中被触发,但在 PrismTabbedPage1ViewModel.cs 中没有被触发

Prism Xamarin 形式

PrismTabbedPage1.Xaml

<?xml version="1.0" encoding="utf-8" ?>
 <TabbedPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms" xmlns:behaviors="clr-namespace:Prism.Behaviors;assembly=Prism.Forms" prism:ViewModelLocator.AutowireViewModel="True" x:Class="testapp.Views.PrismTabbedPage1" ItemsSource="Binding countries"> <TabbedPage.ItemTemplate> 
<DataTemplate> 
<ContentPage Title="Binding CountryName">
 <ListView ItemsSource="Binding Cities"> 
<ListView.ItemTemplate>
 <DataTemplate>
 <ViewCell> 
<Label Text="Binding CityName" TextColor="Black"/> 
</ViewCell>
 </DataTemplate>
 </ListView.ItemTemplate> 
<ListView.Behaviors> 
<behaviors:EventToCommandBehavior EventName="ItemTapped" Command="Binding ListItemTapped" EventArgsParameterPath="Item"/> 
</ListView.Behaviors> </ListView>
 </ContentPage>
 </DataTemplate>
 </TabbedPage.ItemTemplate>
 </TabbedPage>`

PrismTabbedPage1ViewModel.cs

using Prism.Mvvm;
using Prism.Navigation;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using testapp.Models;


namespace testapp.ViewModels

    public class PrismTabbedPage1ViewModel : BindableBase
    
        public ObservableCollection<Country> countries  get; set; 
        public DelegateCommand<Country> ListItemTapped => new DelegateCommand<Country>(OnTapped);

        private void OnTapped(Country obj)
        

            //NavigationService.NavigateAsync("MainPage");
        

        public PrismTabbedPage1ViewModel()
        
            ObservableCollection<City> Cities1 = new ObservableCollection<City>()
            
                new City() CityName = "City1" ,new City() CityName = "City2" ,new City() CityName = "City3" ,
                new City() CityName = "City4" ,new City() CityName = "City5" ,new City() CityName = "City6" ,
                new City() CityName = "City7" ,new City() CityName = "City8" ,new City() CityName = "City9" ,
            ;


            countries = new ObservableCollection<Country>()
            
                new Country() CountryName = "Country 1", Cities = Cities1 ,
                new Country() CountryName = "Country 2", Cities = Cities1 ,
                new Country() CountryName = "Country 3",  Cities = Cities1 ,
            ;
        
    

Country.cs

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Text;

namespace testapp.Models

public class Country

public string CountryName  get; set; 
public ObservableCollection Cities  get; set; 

public class City

public string CityName  get; set; 





在此代码中,不会触发 listview 命令行为。

【问题讨论】:

【参考方案1】:

我不熟悉 Prism,但由于您的 EventToCommand 在 ListView 中,因此您的默认绑定是列表视图传递的数据,而不是您的 ViewModel。

你可以试试这样的:

<behaviors:EventToCommandBehavior EventName="ItemTapped"
                         Command="Binding Source=x:Reference this,Path=BindingContext.ListItemTapped"
                         EventArgsParameterPath="Binding ."/>

并为您的页面命名:

 <TabbedPage .... x:Name="this">

因此,您在列表视图中的绑定应该有效地重定向到视图模型中的命令。

我希望这会有所帮助。

【讨论】:

以上是关于使用 Prism Xamarin 表单创建动态 TabbedPage的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Xamarin 表单中的视图模型之间最好地传递信息 - Prism [关闭]

如何使用 xamarin 表单提高移动设备的性能

使用 Prism 在 Xamarin Forms 的后台服务中实现依赖注入

在 xamarin 表单中保存和恢复应用程序状态

如何在 xamarin 表单中动态创建标签上的点击事件

Prism Xamarin Forms 选项卡式页面导航不起作用