NellβMVVM si usa lβinterfaccia ICommand
per prendere un particolare evento e portarlo nel ViewModel
.
Il problema Γ¨ che spesso non tutti gli eventi sono supportati, per esempio nel Button
Γ¨ supportato il Click
ma se voglio fare un evento sul LostFocus
di una TextBox
(esempio) non ho modo di passare quellβevento al ViewModel
.
Per risolvere ci sono due metodi
Sfruttare il cambio di una property bindata
Questo Γ¨ il classico caso di eventi che si triggerano se qualcosa cambia: per esempio per prendere lβevento di CheckedChanged
di un Checkbox
posso bindarmi alla property IsChecked
e sfruttare, code behind, il metodo partial che si triggera quando questa property viene cambiata (metodo che viene generato con il pacchetto CommunityToolkit.Mvvm
).
Esempio questa Γ¨ la property nello XAML
<CheckBox IsChecked="{Binding MinCheckboxIsChecked}" />
e nel ViewModel
avrΓ²
[ObservableProperty] private bool _minCheckboxIsChecked;
partial void OnMinCheckboxIsCheckedChanged(bool value)
{
BuildAndRefresh(ChartFilter);
}
Pacchetto nuget Microsoft.xaml.behaviors
Questo pacchetto permette di far diventare Command
qualsiasi evento.
Vediamo, per esempio, il codice per avere come Command
lβevento di LostFocus
:
<TextBox>
<b:Interaction.Triggers>
<b:EventTrigger EventName="LostFocus">
<b:InvokeCommandAction Command="{Binding SearchLostFocusCommand}" />
</b:EventTrigger>
</b:Interaction.Triggers>
</TextBox>
EventName
: nome dellβevento dellβUserControl
che voglio utilizzareInvokeCommandAction
: oggetto che lancia il comando passato inCommand
, comando presente nelViewModel
.
Con questo pacchetto Γ¨ possibile anche bindarmi agli eventi del mouse che riguardano lβoggetto, per esempio se come EventName
scrivo MouseLeftButtonDown
posso avere un command che si triggera quando lβutente clicca con il mouse sullβUserControl
.