我有斑马线是正确扫描我的xamarin应用QR码的一个问题,但它确实多次,并将其发送给其他的ViewModels超过一次。要解决这个问题,我使用一个计数器和它的作品好。所以我想使用由MvvmLight提供信使送,从视图,消息视图模型的每一个我的观点开始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;
}
消息是单向的,另一个MVVM友好的方式是监听视图视图模型数据的变化,然后触发后面的代码。
使用大卫的优秀行为库,当数据从其他服务来在视图中触发当数据变化背后的代码。
<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这个问题。