WinUI3 - keybordaccelerators not working as I expect

91 Views Asked by At

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>

I've created a gif: enter image description here

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:

enter image description here

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.

0

There are 0 best solutions below