【问题标题】:Communication between View and ViewModel in Xamarin.FormsXamarin.Forms 中 View 和 ViewModel 之间的通信
【发布时间】:2019-02-06 14:24:17
【问题描述】:

我的 ZXing 在我的 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;
    }

【问题讨论】:

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


    【解决方案1】:

    消息传递是一种方式,另一种 MVVM 友好的方式是监听视图中的 viewmodel 数据变化,然后触发后面的代码。

    使用 David 优秀的行为库,当数据从 REST 服务进来时,视图会在数据发生变化时触发背后的代码。

    <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 关于这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-11
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      相关资源
      最近更新 更多