Не удается передать контекст привязки через Navigation.pushasyn c с помощью collectionview в xamarin - PullRequest
0 голосов
/ 06 мая 2020

Я новичок в Xamarin и создаю небольшой прототип приложения. Поскольку это пилотный проект, я делаю его простым и не использую MVVM.

Ожидаемый результат: У меня есть представление коллекции, и когда я выбираю элемент из этого представления, я хочу связать данные из этого элемента и перейти на новую страницу. Я хочу, чтобы новая страница была связана с данными, которые я выбрал из представления коллекции, так как на этой странице будет несколько кнопок с разными параметрами.

Проблема: Когда выбран элемент из представления коллекции я использую Navigation.pushasyn c, чтобы открыть новую страницу. Внутри этого действия маршрутизации я устанавливаю контекст привязки для данных из выбранного элемента. Когда я перехожу на страницу, ни одна страница не заполняется данными из контекста привязки, который я установил на предыдущей странице.

Комментарий: Я работал с этим в виде списка. Но мне хотелось большей гибкости в стилях моего списка, поэтому я пробую представление коллекции. Мне сложно понять, как привязать данные со списком коллекций и списком.

Просмотр главной страницы:

MainPageView

MainPage.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" 
             x:Class="Notes.MainPage"
             Title="My Numbers">
    <ContentPage.ToolbarItems>
        <ToolbarItem Text="+"
                     Clicked="OnNumberAddedClicked" />
        <ToolbarItem Text="Q"
                     Clicked="GetCount"/>
        <ToolbarItem Text="L"
                     Clicked="GetLast"/>
    </ContentPage.ToolbarItems>
    <ContentPage.Content>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>

            <CollectionView x:Name="listView"
                            SelectionMode="Single"
                            ItemsSource="{Binding listView}">

                <CollectionView.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="100"/>
                                <ColumnDefinition Width="*"/>
                            </Grid.ColumnDefinitions>

                            <StackLayout Orientation="Vertical"
                                         Grid.Column="1">
                                <Label Text="{Binding MyNumber}" FontSize="Title"/>
                                <Label Text="{Binding DateAdded}" FontSize="Subtitle"/>
                            </StackLayout>
                        </Grid>
                    </DataTemplate>
                </CollectionView.ItemTemplate>
            </CollectionView>
        </Grid>
    </ContentPage.Content>
</ContentPage>

MainPage.xaml.cs:

using System;
using Xamarin.Forms;
using Notes.Models;

namespace Notes
{
    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();

            listView.SelectionChanged += ListView_SelectionChanged;
        }

        async void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            var num = e.CurrentSelection;
            if (num != null)
            {
                await Navigation.PushAsync(new ActionsPage
                {
                    BindingContext = num as NUM
                });
            }
        }

        protected override async void OnAppearing()
        {
            base.OnAppearing();

            listView.ItemsSource = await App.Database.GetNumbersAsync();
        }
    }
}

Просмотр страницы действий: Круг - это место, где должна быть метка, но данные не связываются.

ActionsPage

ActionsPage.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" 
             x:Class="Notes.ActionsPage"
             Title="NUM Actions">
    <StackLayout>
        <Label Text="{Binding myNumber}"
               FontSize="Large"
               VerticalOptions="CenterAndExpand"
               HorizontalOptions="Center" />

        <Button Text="Delete NUM"
                VerticalOptions="CenterAndExpand"
                HorizontalOptions="Center"
                Clicked="OnDeleteButtonClicked" />
    </StackLayout>
</ContentPage>

ActionsPage.xaml.cs:

using Notes.Models;
using System;
using Xamarin.Forms;

namespace Notes
{
    public partial class ActionsPage : ContentPage
    {
        public ActionsPage()
        {
            InitializeComponent();
        }

        async void OnDeleteButtonClicked(object sender, EventArgs e)
        {
            var num = (NUM)BindingContext;
            await App.Database.DeleteNumAsync(num);
            await Navigation.PopAsync();
        }
    }
}

Любая помощь приветствуется

1 Ответ

1 голос
/ 06 мая 2020

Самый простой способ передать значение при навигации - просто передать аргумент в конструктор.

Событие MainPage SelectionChanged:

private async  void ListView_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var num = e.CurrentSelection[0] as NUM;

        if (num != null)
        {
          await Navigation.PushAsync(new ActionsPage(num));

        }
    }

ActionPage:

public partial class ActionsPage : ContentPage
 {
    public int myNumber { get; set; }
    public ActionsPage(NUM num)
    {
        InitializeComponent();
        myNumber = num.MyNumber;

        this.BindingContext = this;
    }

    async void  OnDeleteButtonClicked(System.Object sender, System.EventArgs e)
    {
        //var num = (NUM)BindingContext;
        //await App.Database.DeleteNumAsync(num);
        //await Navigation.PopAsync();
    }
}

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...