Я получаю строку с намерением в MainActivity.cs проекта Android. Я использую Sharedproject. Строка является штрих-кодом, который обновляется намерением, если штрих-код сканируется. Я хочу показать строку штрих-кода в записи или метке .xaml-файла с помощью привязки данных.
Проблема заключается в том, что штрих-код only обновляется в записи и в метке также если я вручную нажал на запись . Как я могу убедиться, что метка или запись обновляются при изменении строки из намерения?
Код:
MainActivity.cs:
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
public static MainActivity Instance;
myBroadcastReceiver receiver;
BarcodeModel barcodeModel;
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
// Barcode
MainActivity.Instance = this;
receiver = new myBroadcastReceiver();
barcodeModel = new BarcodeModel();
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
}
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
protected override void OnResume()
{
base.OnResume();
// Register the broadcast receiver dynamically
RegisterReceiver(receiver, new IntentFilter(Resources.GetString(Resource.String.activity_intent_filter_action)));
}
protected override void OnPause()
{
base.OnPause();
UnregisterReceiver(receiver);
}
public void DisplayResult(Intent intent)
{
// Output the scanned barcode to ViewModel
barcodeModel.decodedData = intent.GetStringExtra(Resources.GetString(Resource.String.datawedge_intent_key_data));
}
}
// Broadcast receiver to receive scanned data
[BroadcastReceiver(Enabled = true)]
public class myBroadcastReceiver : BroadcastReceiver
{
public override void OnReceive(Context context, Intent intent)
{
String action = intent.Action;
if (action.Equals(MainActivity.Instance.Resources.GetString(Resource.String.activity_intent_filter_action)))
{
// A barcode has been scanned
MainActivity.Instance.RunOnUiThread(() => MainActivity.Instance.DisplayResult(intent));
}
}
}
}
ViewModel:
public class BarcodeModel : INotifyPropertyChanged
{
private string data;
public event PropertyChangedEventHandler PropertyChanged;
public BarcodeModel()
{
}
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public string decodedData
{
get { return data; }
set { data = value; OnPropertyChanged(); }
}
ContentPage:
<Label Text="{Binding decodedData}"
HorizontalOptions="StartAndExpand"
VerticalOptions="Center"
TextColor="Accent"/>
<Entry Keyboard="Text"
Placeholder="No Object selected"
VerticalOptions="Center"
HorizontalOptions="StartAndExpand"
x:Name="eintrag"
Text="{Binding decodedData}"/>
BindingContext в .xaml.cs: BindingContext = new BarcodeModel();