Why I can't use navigation when I want scan?

111 views Asked by At

I've got a question for anyone who's worked with the ZXING barcode scanner in Xamarin.

I've got an app that has one page with the following code:

newitempage.xaml Form Scanner

<?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="ERP.Views.NewItemPage"
    Shell.PresentationMode="ModalAnimated"
    Title="New Item"
    xmlns:ios="clr-namespace:Xamarin.Forms.PlatformConfiguration.iOSSpecific;assembly=Xamarin.Forms.Core"
    ios:Page.UseSafeArea="true">
<ContentPage.Content>
<StackLayout Spacing="3" Padding="15">
    <Label Text="Text" FontSize="Medium" />
    <Entry Text="{Binding Text, Mode=TwoWay}" FontSize="Medium" />
    <Button Text="scan" Command="{Binding ScanCommand}" HorizontalOptions="FillAndExpand"></Button>
    <Label Text="Description" FontSize="Medium" />
    <Editor Text="{Binding Description, Mode=TwoWay}" x:Name="mycode" AutoSize="TextChanges" FontSize="Medium" Margin="0" />
    <StackLayout Orientation="Horizontal">
        <Button Text="Cancel" Command="{Binding CancelCommand}" HorizontalOptions="FillAndExpand"></Button>
        <Button Text="Save" Command="{Binding SaveCommand}" HorizontalOptions="FillAndExpand"></Button>
    </StackLayout>
</StackLayout>
</ContentPage.Content>

</ContentPage>

newitempage.xaml.cs

using ERP.Models;
using ERP.ViewModels;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
using ZXing.Net.Mobile.Forms;

namespace ERP.Views
{
    public partial class NewItemPage : ContentPage
    {
        public Item Item { get; set; }

        public NewItemPage()
        {
            InitializeComponent();
            BindingContext = new NewItemViewModel();
        }

newitemviewmodel.cs

private async void OnScan()
    {
        var scan = new ZXingScannerPage();
        await Navigation.PushAsync(scan);
        scan.OnScanResult += (result) =>
        {
            Device.BeginInvokeOnMainThread(async () =>
            {
                await Navigation.PopAsync();
                mycode.Text = result.Text;
            });
        };
    }

Please help how to solve my problem. Thanks

 `await Navigation.PushAsync(scan);`
1

There are 1 answers

4
Jason On BEST ANSWER

Navigation is a property of Page. You can't access it from the VM. A common pattern used in this scenario is to access the MainPage property of the App to use it's Navigation property

App.Current.MainPage.Navigation.PushAsync(scan);