Доступ у event c# mvvm
Имею вот такой ивент во вьюмодели
public delegate void LostMouseCaptureEvent(object sender, MouseEventArgs e);
public event LostMouseCaptureEvent LostMouseCapture;
хочу вызывать его из code behind(.xaml.cs)
private void constructionView_LostMouseCapture(object sender, MouseEventArgs e)
{
LostMouseCapture?.Invoke(sender, e);
}
Как должно быть правильно? использую mvvm и c#
Ответы (1 шт):
Техническая сторона вопроса:
Для вызова кода VM из View используются команды. Например, возьмите реализацию ICommand через RelayCommand (например, отсюда), выставьте в VM свойство типа ICommand, и вызывайте у него метод Execute.
ICommand прекрасно можно привязать к свойству Command кнопки, но если вы хотите привязать к событию в UI, вам понадобится подключить пакет Microsoft.Xaml.Behaviors.Wpf, добавить в корневом элементе (окне или UserControl'е) пространство имён xmlns:i="http://schemas.microsoft.com/xaml/behaviors" и использовать код наподобие такого:
<Grid Name="constructionView">
<i:Interaction.Triggers>
<i:EventTrigger EventName="LostMouseCapture">
<i:InvokeCommandAction Command="{Binding InvokeOnLostCaptureCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
...
Ну или если хотите в code behind, то вам придётся закастить DataContext к его настоящему типу, и вызвать команду «вручную» (что, скажем прямо, крайне неизящно).
Смысловая сторона вопроса:
Вопрос о том, где находится mouse capture — это вопрос компетенции View, и вовсе не должен спускаться на уровень VM. Вы делаете что-то неправильно: информация о том, что происходит с мышью, должна по идее быть обработана во View.