Связь между View и ViewModel в Xamarin.Forms - PullRequest
0 голосов
/ 06 февраля 2019

У меня проблема с ZXing, который корректно сканирует qr-коды в моем приложении xamarin, но это происходит несколько раз и отправляет другим моделям просмотра более одного раза.Чтобы решить эту проблему, я использую счетчик, и он работает хорошо.Поэтому я подумал использовать мессенджер, предоставленный MvvmLight для отправки из представления сообщения в viewmodel для сброса счетчика каждый раз, когда мой просмотр запускает метод OnAppearing.Это хороший способ?Могу ли я сделать это лучше другим способом?

Это мой метод OnAppearing, на мой взгляд:

protected override void OnAppearing()
        {
        base.OnAppearing();
        var messageScanActivation = new MessageResetScan();
        Messenger.Default.Send(messageScanActivation);
        Console.WriteLine("i sent reset message");
    }

Это моя модель представления:

   public ScannerViewModel(INavigationService navigationService, 
  IScanCreatorService scanCreatorService) : base(navigationService)
    {
        _scanCreatorService = scanCreatorService;
        title = "Scan";
        _countScan = 0;
        OnBarcodeScannedCommand = new Command(OnBarcodeScanned);
        _isScanning = true;
        Messenger.Default.Register<MessageResetScan>(this, ResetScan);
    }



    private void OnBarcodeScanned()
    {
        _countScan++;
        _isAnalyzing = false;
        Device.BeginInvokeOnMainThread(() =>
            {
                if (_countScan == 1)
                {
                    Debug.WriteLine("RisultatoScansione: " + Result.Text);
                    UpdateHistoryScans(Result.Text);
                    Debug.WriteLine("currentKey: " + _navigationService.CurrentPageKey);
                    DisplayScanAcquiredPrompt();
                    _navigationService.GoBack();
                }           

            });
        _isAnalyzing = true;

    }

    private void ResetScan(MessageResetScan message)
    {
        Console.WriteLine("I received reset message! CountScan: " + _countScan);
        _countScan = 0;
    }

1 Ответ

0 голосов
/ 07 февраля 2019

Обмен сообщениями - это один из способов, другой дружественный MVVM способ - это прослушивать изменения данных модели представления в представлении и затем запускать код позади.

Используя отличную библиотеку поведения Дэвида и когда данные поступают из остальных служб,view запускает код, когда данные изменяются.

<ContentPage.Behaviors>
<b:DataChangedBehavior Binding="{Binding Position}" ComparisonCondition="NotEqual" Value="{x:Null}">
  <b:InvokeMethodAction TargetObject="{Binding Source={x:Reference GeoposView}}"
                        MethodName="MapRefresh" />
</b:DataChangedBehavior>

Вот аналогичное обсуждение по этому вопросу.

...