es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Escaneo de códigos QR/códigos de barras de zxing utilizando MVVM?

Soy nuevo en Xamarin, estoy tratando de hacer un botón que abra un formulario de escaneo que escanea códigos QR/barras utilizando el método MVVM. Estoy tratando de obtener el resultado y mostrarlo en una etiqueta. Esta es mi mejor suposición, pero no funciona. Espero que alguien me pueda ayudar.

Vista:

<stacklayout>
    <label text="{Binding CodigoQr}"></label>
    <zxing:zxingscannerview x:name="ucZXingScannerView" isscanning="True" isanalyzing="True" result="{Binding CodigoQr}" scanresultcommand="{Binding ScanCommand}"></zxing:zxingscannerview>
</stacklayout>

ViewModel:

public class BarcodeScanVM : BaseViewModel
{
    private Result _codigoQr;
    public Result CodigoQr
    {
        get { return _codigoQr; }
        set
        {
            _codigoQr = value;
            OnPropertyChanged();
        }
    }
    public AsyncCommand ScanCommand { get; set; }
    public BarcodeScanVM()
    {
        ScanCommand = new AsyncCommand(OnScanResultCommand);
    }
    async Task OnScanResultCommand()
    {
        var text = CodigoQr;
    }
}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que estás en el camino correcto, pero hay algunas cosas que debes cambiar en tu código para que funcione.

    En primer lugar, asegúrate de haber instalado el paquete ZXing.Net.Mobile y haber agregado las referencias necesarias a tu proyecto.

    A continuación, en tu vista, debes enlazar la propiedad Result del ZXingScannerView a una propiedad en tu modelo de vista utilizando la enlace de forma bidireccional (TwoWay binding). Esto asegurará que cualquier resultado de escaneo se actualice inmediatamente en tu modelo de vista. También puedes eliminar el enlace de ScanResultCommand ya que no es necesario para este escenario.

    Aquí tienes una versión actualizada del código de tu vista:

    <stacklayout>
        <label text="{Binding CodigoQr}"></label>
        <zxing:zxingscannerview x:name="ucZXingScannerView" isscanning="True" isanalyzing="True" result="{Binding CodigoQr, Mode=TwoWay}"></zxing:zxingscannerview>
    </stacklayout>
    

    En tu modelo de vista, debes manejar el resultado del escaneo en el setter de la propiedad CodigoQr. Aquí es donde puedes actualizar el texto de tu etiqueta (label).

    Aquí tienes una versión actualizada del código de tu modelo de vista:

    public class BarcodeScanVM : BaseViewModel
    {
        private string _codigoQr;
        public string CodigoQr
        {
            get { return _codigoQr; }
            set
            {
                _codigoQr = value;
                OnPropertyChanged();
                // Actualizar el texto de la etiqueta aquí
            }
        }
    
        public BarcodeScanVM()
        {
        }
    }
    

    Con estos cambios, deberías poder escanear un código QR o de barras y tener el resultado mostrado de inmediato en tu etiqueta (label).

Comments are closed.