【问题标题】:zxing qr/barcode scanning using MVVM?zxing qr/条码扫描使用 MVVM?
【发布时间】:2022-01-23 12:18:08
【问题描述】:

我是 xamarin 的新手,我正在尝试制作一个按钮来打开一个扫描仪表单,该表单可以扫描 MVVM 方法的 qr/条形码。我试图得到结果并将其显示到标签中。这是我最好的客人,但它不起作用,希望有人能提供帮助。

view:
<StackLayout>
 <Label Text="{Binding CodigoQr}"/>
 <zxing:ZXingScannerView x:Name="ucZXingScannerView" 
  IsScanning="True" 
  IsAnalyzing="True"
  Result="{Binding CodigoQr}"
  ScanResultCommand="{Binding ScanCommand }" />
 </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;
        }
    }```

【问题讨论】:

    标签: xamarin xamarin.forms zxing.net.mobile


    【解决方案1】:

    更新:我试过这个,似乎扫描命令有效,但程序随后停止。

    ViewMode:
    private Result bcScanResult;
        public Result BcScanResult
        {
            get => bcScanResult;
            set
            {
    
                if (value == bcScanResult)
                    return;
                bcScanResult = value;
                OnPropertyChanged();
            }
        }
    
      public AsyncCommand BcScanCommand { get; }
    
      public CodeScanVM()
        {
            BcScanCommand = new AsyncCommand(BcScanCommand_Call);
        }
    
      async Task BcScanCommand_Call()
        {
            await App.Current.MainPage.DisplayAlert("Item", "Code Async 
            Command:" + Result, "OK");
            return;
        }
    
     View:
     <zxing:ZXingScannerView
                x:Name="ScanView"
                Result="{Binding BcScanResult}"
                ScanResultCommand="{Binding BcScanCommand }"
                IsScanning="True"
                WidthRequest="300"
                HeightRequest="300"/>
    

    【讨论】:

    • 程序停止时,有没有报错?如果没有错误,您在输出窗口中得到了什么?
    【解决方案2】:

    您可以使用视图隐藏的代码来执行操作。并将 VM 用于其他属性

    XAML:

     <zxing:ZXingScannerView
            IsAnalyzing="{Binding IsAnalyzing}"
            IsScanning="{Binding IsScanning}"
            OnScanResult="CameraScanner_OnScanResult" />
    

    后面的代码:

    private void CameraScanner_OnScanResult(ZXing.Result result)
            {   
                 ((MyViewModel)BindingContext).OnScanComplete(result.Text);
            }
    

    【讨论】: