Xamarin.Forms中的View和ViewModel之间的通信

时间:2019-02-06 14:24:18

标签: c# events xamarin.forms mvvm-light zxing

我在ZXing上遇到问题,该问题可以正确扫描我的xamarin应用程序中的qr代码,但是它执行了多次,并且多次发送给其他视图模型。为了解决这个问题,我使用了一个计数器,它很好用。因此,我认为每次我的视图启动OnAppearing方法时,都使用MvvmLight提供的Messenger从视图向视图模型发送消息以重置计数器。这是个好方法吗?我可以用其他方式做得更好吗?

在我看来,这是我的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 :(得分:1)

消息传递是一种方法,另一种对MVVM友好的方法是侦听视图中视图模型数据的更改,然后触发后面的代码。

使用David出色的行为库,当数据来自其余服务时,视图将在数据更改时触发代码。

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

这里是a similar discusion这个问题。