Событие WPF привязки от View to ViewModel?

Как лучше всего связать событие WPF в представлении ViewModel?

Я получил событие drop в моем представлении, но я хочу заменить его на обязательную привязку ViewModel. Нашли несколько решений, но ни один из них не сделал то, что я оценил.

Просмотр кода:

    <TextBox 
    AllowDrop="True" 
    PreviewDrop="email_Drop" />

Ответы

Ответ 1

Один из способов обработки событий в MVVM и XAML - использовать функции интерактивного взаимодействия. Это пространство имен содержит классы InvokeCommandAction и CallMethodAction.

InvokeCommandAction позволяет связать любое событие с командой view-model, в то время как CallMethodAction позволяет привязывать любое событие к методу модели представления.

Например, если вы хотите привязать событие DoubleClick кнопки к команде view-model, вы должны сделать следующее:

<Button>
    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseDoubleClick">
            <i:InvokeCommandAction Command="{Binding Path=DoSomethingCommand}"/>
        </i:EventTrigger>
    </i:Interaction.Triggers>
</Button>

И объявив это пространство имен:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"

Все, что вам нужно для ссылки в ваших проектах, - установить Expression Blend или SDK Expression Blend.

Ответ 3

<Button MouseDoubleClick="{eb:EventBinding Command=DoSomethingCommand}">

</Button>

Команда

{eb: EventBinding} (Простой шаблон именования для поиска команды)

{eb: EventBinding Command = CommandName}

CommandParameter

$e (EventAgrs)

$this или $this.Property

строка

https://github.com/JonghoL/EventBindingMarkup

Ответ 4

Я получаю viewmodel из bindingcontext и активирую свой метод viewmodel оттуда

    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);
            }
    }