代码之家  ›  专栏  ›  技术社区  ›  KalleP

将数据参数从模型传递到下一页Prism Xamarin窗体

  •  0
  • KalleP  · 技术社区  · 6 年前

    TodoItem

    public TodoItem _todotItem { get; set; }
    
    private readonly INavigationService _navigationService;
    

    我在构造器中分配了它:

    public MainPageViewModel(INavigationService navigationService, TodoItem todotItem)
    {
        _navigationService = navigationService;
        _todotItem = todotItem;
    }
    

    这是我用来导航到下一页的代码(包括参数):

    NavigationParameters navParams = new NavigationParameters();
    navParams.Add("PassedValue", _todoItem.name);
    
    _navigationService.NavigateAsync("SecondPage", navParams);
    

    当我设置断点时 _todoItem.name 上面写着 无效的 listview

    编辑:

    这就是我导航的方式(从 列表视图 ):

    private EventItem _selectedEvent { get; set; }
    public EventItem SelectedEvent
    {
        get { return _selectedEvent; }  
        set
        {
            if (_selectedEvent != value)
            {
                if (Device.RuntimePlatform == Device.iOS)
                {
                    _selectedEvent = null;
                }
                else
                {
                    _selectedEvent = value;
                }
                NavigationParameters navParams = new NavigationParameters();
    
                navParams.Add("PassedValue", _todoItem.name);
    
    
                _navigationService.NavigateAsync("SecondPage", navParams);
            }
        }
    }
    

    我确实使用了正确的方法来捕捉第二个 ViewModel (然而,我明白 一开始 ):

    public void OnNavigatingTo(INavigationParameters parameters)
    {
        if (parameters.ContainsKey("PassedValue"))
        {
            _todo = (string)parameters["PassedValue"];
    
            OnPropertyChanged("Todo");
        }
    
    }
    

    我用 HTTPClient 获取数据。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Jader Oliveira    6 年前

    为了捕获第二页上的参数,必须使用 Prism.Navigation.INavigationAware . 请检查下面的代码,也许能帮到你。

    ./视图/ItemView.xaml

    <?xml version="1.0" encoding="utf-8" ?>
    <ContentPage 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" 
        prism:ViewModelLocator.AutowireViewModel="True" 
        x:Class="Project.Views.ItemView"
        Title="{Binding Title}">
    
        <StackLayout>
            <!-- List View -->
            <ListView ItemsSource="{Binding Items}" 
                      CachingStrategy="RecycleElement" 
                      HorizontalOptions="FillAndExpand"
                      VerticalOptions="FillAndExpand" 
                      HasUnevenRows="True" 
                      SelectionMode="None">
                <ListView.Behaviors>
                    <b:EventToCommandBehavior EventName="ItemTapped" 
                                              Command="{Binding ItemTappedCommand}" 
                                              EventArgsParameterPath="Item" />
                </ListView.Behaviors>
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <!-- Data Template Cell -->
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </StackLayout>
    
    </ContentPage>
    

    ./ViewModels/ViewModelBase.cs

    using Prism;
    using Prism.Mvvm;
    using Prism.Navigation;
    using System;
    
    namespace Project.ViewModels
    {
        // INavigationAware provides a way for objects involved in navigation to be notified of navigation activities.
        public class ViewModelBase : BindableBase, INavigationAware, IDestructible
        {
            // ...
    
            protected INavigationService NavigationService { get; private set; }
    
            public ViewModelBase(INavigationService navigationService) => NavigationService = navigationService;
    
            /// <summary>
            /// Called when the implementer is being navigated away from.
            /// </summary>
            public virtual void OnNavigatedFrom(INavigationParameters parameters)
            {
    
            }
    
            /// <summary>
            /// Called when the implementer has been navigated to.
            /// </summary>
            public virtual void OnNavigatedTo(INavigationParameters parameters)
            {
    
            }
    
            // ...
        }
    }
    

    using Prism.Navigation;
    using System;
    using System.Collections.ObjectModel;
    using System.Threading.Tasks;
    using System.Windows.Input;
    using Xamarin.Forms;
    
    namespace Project.ViewModels
    {
        public class ItemViewModel : ViewModelBase
        {
            // ...
    
            private ObservableCollection<ItemList> _items;
            public ObservableCollection<ItemList> Items
            {
                get => _items;
                set => SetProperty(ref _items, value);
            }
    
            public ICommand ItemTappedCommand => new AsyncCommand(ItemTappedCommandAsync);
    
            public ItemViewModel(INavigationService navigationService)
                : base(navigationService)
            {
                Items = new ObservableCollection<ItemList>();
                // Load the data
            }
    
            // ...
    
            private async Task ItemTappedCommandAsync(object item)
            {
                var navParams = new NavigationParameters
                {
                    { "ItemSelected", (Item)item }
                };
    
                await NavigationService.NavigateAsync(nameof(ItemDetailView), navParams);
            }
        }
    }
    

    ./ViewModels/itemdailviewmodel.cs

    using Prism.Navigation;
    using System;
    using System.Collections.ObjectModel;
    using System.Threading.Tasks;
    using System.Windows.Input;
    using Xamarin.Forms;
    
    namespace Project.ViewModels
    {
        public class ItemDetailViewModel : ViewModelBase
        {
            // ...
    
            public override void OnNavigatingTo(INavigationParameters parameters)
            {
                // Capture the parameter
                System.Diagnostics.Debug.WriteLine(parameters);
            }
    
            // ...
        }
    }