I select an "Operator" from a ListView then use Xamarin.Essentials Preferences to store the various Operator attributes, as per SelectOperatorPage.xaml.cs:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
using HandsFreeNotes.ViewModel;
using HandsFreeNotes.Model;
using HandsFreeNotes.Data;
using Xamarin.Essentials;
namespace HandsFreeNotes.View
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class SelectOperatorPage : ContentPage
{
OperatorViewModel ovm;
public EventHandler<OperatorModel> ReturnValue;
public SelectOperatorPage()
{
// add a bit of padding to cater to the "notch" on the iPhone.
if (Device.RuntimePlatform == Device.iOS) { Padding = new Thickness(0, 40, 0, 0); }
InitializeComponent();
}
protected override async void OnAppearing()
{
base.OnAppearing();
HFNDatabase database = await HFNDatabase.Instance;
OperatorListView.ItemsSource = await database.GetOperatorsAsync();
}
private async void BackButton_Clicked(object sender, EventArgs e)
{
await Navigation.PopModalAsync();
}
private async void OperatorListView_ItemSelected(object sender, SelectedItemChangedEventArgs e)
{
if (e.SelectedItem != null)
{
OperatorModel operatorModel = (OperatorModel)e.SelectedItem;
EventHandler<OperatorModel> handler = ReturnValue;
if (handler != null)
{
handler(this, operatorModel);
// Added these lines to set Xamarin.Essentials Preferences keys GMB: 07/06/2021
Preferences.Clear();
int selOpID = operatorModel.OperatorID;
string selOpName = operatorModel.OperatorName;
string selOpPhone = operatorModel.OperatorPhone;
string selOpEmail = operatorModel.OperatorEmail;
string selOpAvatar = operatorModel.OperatorAvatar;
Preferences.Set("selOpID_key", selOpID.ToString());
Preferences.Set("selOpName_key", selOpName);
Preferences.Set("selOpPhone_key", selOpPhone);
Preferences.Set("selOpEmail_key", selOpEmail);
Preferences.Set("selOpAvatar_key", selOpAvatar);
// DisplayAlert("Alert", selOpID.ToString() + " - " + selOpName + " - " + selOpPhone + " - " + selOpEmail + " - " + selOpAvatar, "Continue");
}
await Navigation.PopModalAsync();
}
}
}
}
When the app is later opened again, I reinstate the Operator Name ("selOpName") to a button name, but when I click on "Update Operator", the Operator is no longer selected. This happens in OperatorsPage.xaml.cs:
using HandsFreeNotes.ViewModel;
using HandsFreeNotes.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
using HandsFreeNotes.Data;
namespace HandsFreeNotes.View
{
[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class OperatorsPage : ContentPage
{
OperatorViewModel ovm;
OperatorModel opm;
public EventHandler<OperatorModel> ReturnValue;
public OperatorsPage(OperatorModel SelectModel)
{
// add a bit of padding to cater to the "notch" on the iPhone.
if (Device.RuntimePlatform == Device.iOS) { Padding = new Thickness(0, 40, 0, 0); }
InitializeComponent();
if (SelectModel != null)
{
opm = SelectModel;
}
else
{
opm = new OperatorModel();
}
BindingContext = opm;
}
private async void BackButton_Clicked(object sender, EventArgs e)
{
if (SelectModel != null)
{
EventHandler<OperatorModel> handler = ReturnValue;
if (handler !=null)
{
handler(this, opm);
}
}
await Navigation.PopModalAsync();
}
private async void AddOperatorButton_Clicked(object sender, EventArgs e)
{
await Navigation.PushModalAsync(new NewOperatorPage {
BindingContext = new OperatorModel()
});
}
private async void SelectOperatorButton_Clicked(object sender, EventArgs e)
{
SelectOperatorPage page = new SelectOperatorPage();
page.ReturnValue += delegate (object s, OperatorModel operatorModel)
{
BackCall(s, operatorModel);
};
await Navigation.PushModalAsync(page);
}
OperatorModel SelectModel;
private void BackCall(object s, OperatorModel model)
{
SelectModel = model;
opm.OperatorName = model.OperatorName;
}
private async void DeleteOperatorButton_Clicked(object sender, EventArgs e)
{
if (SelectModel != null)
{
bool answer = await DisplayAlert("Warning!", "Do you really want to delete Operator " + SelectModel.OperatorName, "Yes", "No");
if (answer == true)
{
HFNDatabase database = await HFNDatabase.Instance;
await database.DeleteItemAsync(SelectModel);
SelectModel = null;
SelectedOperatorEntry.Text = "";
}
}
else
{
await DisplayAlert("Info", "Please select an Operator to delete", "OK");
}
}
private async void UpdateOperatorButton_Clicked(object sender, EventArgs e)
{
if (SelectModel != null)
{
var operatorInfoPage = new OperatorInfoPage(SelectModel);
operatorInfoPage.ReturnValue += delegate (object s, OperatorModel operatorModel)
{
BackCall(s, operatorModel);
};
await Navigation.PushModalAsync(operatorInfoPage);
}
else
{
await DisplayAlert("Info", "Please select an Operator", "OK");
}
}
}
}
In the last method (UpdateOperatorButton_Clicked), I suspect I have to add an "else if" statement to rebuild the selection from my saved Preferences, potentially calling the BackCall method, but I'm floundering on how to do that.