web-dev-qa-db-fra.com

Liaison d'événements WPF de View à ViewModel?

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" />
24
jefsmi

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.

55
Ucodia

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)

5
Bhupendra Joshi
<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

https://github.com/JonghoL/EventBindingMarkup

1
jongho

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);
            }
    }
0
sjors miltenburg