Quelle est la meilleure façon de lier un événement WPF dans la vue au ViewModel?
J'ai un événement drop dans ma vue, mais je veux le remplacer par la liaison due à ViewModel.
J'ai trouvé plusieurs solutions mais aucune n'a fait ce que j'attendais.
Afficher le code:
<TextBox
AllowDrop="True"
PreviewDrop="email_Drop" />
Une façon de gérer les événements dans MVVM et XAML consiste à utiliser les fonctionnalités d'interaction de mélange. Cet espace de noms contient les classes InvokeCommandAction et CallMethodAction.
InvokeCommandAction vous permet de lier n'importe quel événement à une commande view-model tandis que CallMethodAction vous permet de lier n'importe quel événement à une méthode view-model.
Par exemple, si vous souhaitez lier l'événement DoubleClick d'un Button à une commande view-model, vous feriez comme ceci:
<Button>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<i:InvokeCommandAction Command="{Binding Path=DoSomethingCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
Et déclarer cet espace de noms:
xmlns:i="http://schemas.Microsoft.com/expression/2010/interactivity"
Tout ce dont vous avez besoin pour le référencer dans vos projets est d'installer Expression Blend ou le SDK Expression Blend.
Eh bien, une façon de faire est de convertir cet événement en une commande, puis de le lier à la commande du présentateur, c'est-à-dire en définissant le comportement de l'événement.
Voir ceci, Liaison d'événements WPF à ViewModel (pour les classes non-Command)
<Button MouseDoubleClick="{eb:EventBinding Command=DoSomethingCommand}">
</Button>
Commande
{eb: EventBinding} (modèle de dénomination simple pour trouver la commande)
{eb: EventBinding Command = CommandName}
CommandParameter
$ e (EventAgrs)
$ this ou $ this. Propriété
chaîne
J'obtiens le viewmodel du contexte de liaison et j'active ma méthode viewmodel à partir de là
public partial class ParentView : ContentPage
{
public ParentView()
{
InitializeComponent();
}
private void LanguagePicker_SelectedIndexChanged(object sender, System.EventArgs e)
{
var parentViewModel = (ParentViewModel)this.BindingContext;
parentViewModel.SelectedLanguageChanged(sender,e);
}
}