I'm creating a opening hours management and I'd like to use KeyboardAccelerators.
In my model, I have a save button and I have implemented a save command action when the enter key is pressed in the textbox control.
This is textbox xaml:
<TextBox x:Name="primaapertura" ex:TextBoxExtensions.Mask="99:99 99:99"
Margin="0"
Text="{x:Bind GiorniOperativi.OpeningHours.PrimaApertura, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
<TextBox.KeyboardAccelerators>
<KeyboardAccelerator Key="Enter" Modifiers="None">
<interactivity:Interaction.Behaviors>
<interactionCore:EventTriggerBehavior EventName="Invoked">
<interactionCore:InvokeCommandAction Command="{x:Bind GiorniOperativi.SaveHoursCommand}"/>
</interactionCore:EventTriggerBehavior>
</interactivity:Interaction.Behaviors>
</KeyboardAccelerator>
</TextBox.KeyboardAccelerators>
</TextBox>
As you see, it works fine clicking on the save button (first item), while the second doesn't: when I push the enter key it doesn't clear the textbox. For save new item I use the same method.
EDIT
This is my save button:
<Button Command="{x:Bind GiorniOperativi.SaveHoursCommand}" x:Name="salva">
<SymbolIcon Symbol="Save"/>
</Button>
EDIT 2
This is SaveOpeningHoursCommand:
[RelayCommand]
void SaveHours()
{
OraAperturaData clone = OpeningHours.CloneObject() as OraAperturaData;
OraAperturaData isExists= _oc.Where(c => c.IsEqualJson(clone)).FirstOrDefault();
if(isExists is not null)
{
return;
}
OraApertura cloneOraApertura=clone.GetOraApertura();
cloneOraApertura.SecondaApertura = cloneOraApertura.SecondaApertura.Replace("_", string.Empty).Replace(":", string.Empty).Trim();
OraAperturaData oaExisting = _oc.Where(c => c.GetOraApertura().IsEqualJson(_oldOraApertura)).FirstOrDefault();
if (_oldOraApertura is not null)
{
clone.SetPropertiesValue<OraApertura>(oaExisting);
var isData=ItemsSource.Where(c => c.IsEqualJson(cloneOraApertura)).FirstOrDefault();
if (isData is not null)
{
cloneOraApertura.SetPropertiesValue<OraApertura>(isData);
}
}
else
{
//OraAperturaData clone = OpeningHours.CloneObject() as OraAperturaData;
_oc.Add(clone);
ItemsSource.Add(clone.GetOraApertura().CloneObject() as OraApertura);
}
Reset();
}
This Reset method:
[RelayCommand]
void Reset()
{
_oldOraApertura = null;
//TelefonoInfo = new();
OpeningHours.Refresh();
}
And this is OpeningHours refresh method:
public void Refresh()
{
_ora = new OraApertura();
OnPropertyChanged(propertyName: null);
}
EDIT 3
A new gif:
the second textbox not implement keyboardaccelerators
EDIT 4
The OpeningHours is the instance of OraAperturaData class as:
public partial class OraAperturaData : ObservableObject,IOraApertura
{
OraApertura _ora;
public OraAperturaData()
{
_ora = new();
}
public OraAperturaData(OraApertura apertura)
{
_ora = apertura;
}
public int? Giorno
{
get=>_ora.Giorno;
set=> SetProperty(_ora.Giorno, value, _ora, (o, p) => { o.Giorno = p; });
}
//[CheckHours(ErrorMessage ="Il campo Orario prima apertura non è compilato correttamente")]
public string PrimaApertura
{
get=> _ora.PrimaApertura;
set
{
if (SetProperty(_ora.PrimaApertura, value, _ora, (o, p) => o.PrimaApertura = p)) test();
}
}
//[CheckHours(ErrorMessage = "Il campo Orario seconda apertura non è compilato correttamente")]
public string SecondaApertura
{
get => _ora.SecondaApertura;
set
{
if (SetProperty(_ora.SecondaApertura, value, _ora, (o, p) => o.SecondaApertura = p)) test();
}
}
[ObservableProperty] bool _hasErrors;
[ObservableProperty] bool _isErrorImgVisible;
public OraApertura GetOraApertura() => _ora;
public void Refresh()
{
_ora = new OraApertura();
OnPropertyChanged(propertyName: null);
}
void test()
{
if (PrimaApertura is null || SecondaApertura is null)
{
HasErrors = true;
return;
}
int primo_=PrimaApertura.Replace("_",string.Empty).Replace(":",string.Empty).Replace(" ",string.Empty).Count();
int secondo_ = SecondaApertura.Replace("_", string.Empty).Replace(":", string.Empty).Replace(" ", string.Empty).Count();
if (primo_ == 0 && secondo_==0 && Giorno is null)
{
HasErrors = true;
IsErrorImgVisible = false;
return;
}
string pattern = @"(?:[0-1]\d|[2][0-3]):[0-5]\d (?:[0-1]\d|[2][0-3]):[0-5]\d";
bool regexIsValidPrimaApertura = Regex.IsMatch(PrimaApertura, pattern);
bool regexIsValidSecondaApertura = Regex.IsMatch(SecondaApertura, pattern);
if (regexIsValidPrimaApertura && !regexIsValidSecondaApertura && secondo_==0)
{
string[] aperturaArray = PrimaApertura.Split(' ');
DateTime apertura, chiusura;
DateTime.TryParse(aperturaArray[0], out apertura);
DateTime.TryParse(aperturaArray[1], out chiusura);
if (apertura > DateTime.MinValue && chiusura > DateTime.MinValue && chiusura > apertura)
{
HasErrors = false;
IsErrorImgVisible = false;
//ListaErrori = string.Empty;
// ValidationResult.Success;
}
else
{
HasErrors = true;// new ValidationResult(ErrorMessage);
IsErrorImgVisible = true;
}
}
else if (!regexIsValidPrimaApertura && regexIsValidSecondaApertura) {HasErrors=true;IsErrorImgVisible = true; }
else if (!regexIsValidPrimaApertura && !regexIsValidSecondaApertura)
{
//if (PrimaApertura.Replace("_",string.Empty).Replace(":",string.Empty).Trim()==string.Empty && SecondaApertura.Replace("_", string.Empty).Replace(":", string.Empty).Trim() == string.Empty)
//{
//ListaErrori = string.Empty;
HasErrors = true;
IsErrorImgVisible = true;
//}
}
else
{
string[] paperturaArray = PrimaApertura.Split(' ');
string[] saperturaArray=SecondaApertura.Split(' ');
DateTime papertura, pchiusura,sapertura,schiusura;
DateTime.TryParse(paperturaArray[0], out papertura);
DateTime.TryParse(paperturaArray[1], out pchiusura);
DateTime.TryParse(saperturaArray[0], out sapertura);
DateTime.TryParse(saperturaArray[1], out schiusura);
if (papertura > DateTime.MinValue && pchiusura > DateTime.MinValue
&& sapertura > DateTime.MinValue && schiusura > DateTime.MinValue
&& pchiusura > papertura && sapertura > pchiusura && schiusura > sapertura)
{
HasErrors = false;
IsErrorImgVisible = false;
//ListaErrori = string.Empty;
// ValidationResult.Success;
}
else
{
HasErrors = true;// new ValidationResult(ErrorMessage);
IsErrorImgVisible= true;
}
}
}
}
The Refresh method of this class create a new _ora instance and I update the properties with "OnPropertyChanged(propertyName:null)" method.

