Tworzę UserControl w aplikacji UWP na wzorcu MVVM (moja pierwsza styczność ze wzorcem). Ta kontrolka wymaga pobrania pewnych danych, więc stworzyłem dla niej ViewModel i tam przesyłam dane z ViewModel rodzica. Problem polega na tym, że nie jestem w stanie zrobić wszystkiego, bo nie powinienem przesyłać obiektu z widoku do ViewModels, bo to zdaje się łamie zasady MVVM, a muszę zrealizować pewne zadanie i prawdopodobnie tego wymagam.
Poniżej mam fragment kodu z kontrolki. Kontrolka ma za zadanie manipulować obrazem wewnątrz podczas interakcji użytkownika. Prawie wszystko działa po związaniu widoku z jego modelem widoku. Niestety najprawdopodobniej muszę wykorzystać tę metodę https://docs.microsoft.com/en-us/uwp/api/windows.ui.xaml.input.pointerroutedeventargs.getcurrentpoint dla elementu Image i podać go w argumencie by móc śledzić położenie obrazu podczas manipulacji. Wszystko działa jak go tam przekażę, obraz się przemieszcza w stosownych granicach, przybliżanie i oddalanie na punkt kursora, ale samo przekazywanie kontrolki łamie zasadę MVVM.
Moje pytania to:
Czy da się to w jakiś sposób obejść? Tzn. nie przesyłać obiektu do tej metody z linku tylko jakieś parametry z widoku przykładowo.
Czy ten sposób realizacji eventów w ViewModel w ogóle jest poprawny dla wzorca?
Dodam, że do działania w ViewModel komendy są w takiej formie:
RelayCommand<PointerRoutedEventArgs> PointerWheelChangedCommand
Po wywołaniu eventów dokonywane są zmiany w CompositeTransformProperties z przekazanego PointerRoutedEventArgs pobieram informacje.
Przykład ```
CompositeTransformProperties.TranslateX += deltaX;
Fragment widoku:
<Image
DataContext="{Binding Source={StaticResource ViewModelLocator}, Path=ImagePreview}"
Margin="50"
Source="{Binding Path=ImageSource}"
Opacity="{Binding Path=Opacity, Mode=TwoWay}"
HorizontalAlignment="Center"
IsTapEnabled="True"
VerticalAlignment="Center"
ManipulationMode="TranslateX, TranslateY, System">
<interactivity:Interaction.Behaviors>
<core:EventTriggerBehavior EventName="Tapped">
<core:InvokeCommandAction Command="{Binding Path=TappedCommand}" />
</core:EventTriggerBehavior>
<core:EventTriggerBehavior EventName="ManipulationStarted">
<core:InvokeCommandAction Command="{Binding Path=ManipulationStartedCommand}" />
</core:EventTriggerBehavior>
<core:EventTriggerBehavior EventName="ManipulationDelta">
<core:InvokeCommandAction Command="{Binding Path=ManipulationDeltaCommand}" />
</core:EventTriggerBehavior>
<core:EventTriggerBehavior EventName="PointerWheelChanged">
<core:InvokeCommandAction Command="{Binding Path=PointerWheelChangedCommand}" />
</core:EventTriggerBehavior>
<core:EventTriggerBehavior EventName="ManipulationCompleted">
<core:InvokeCommandAction Command="{Binding Path=ManipulationCompletedCommand}" />
</core:EventTriggerBehavior>
</interactivity:Interaction.Behaviors>
<Image.RenderTransform>
<CompositeTransform
ScaleX="{Binding Path=CompositeTransformProperties.ScaleX, Mode=TwoWay}"
ScaleY="{Binding Path=CompositeTransformProperties.ScaleY, Mode=TwoWay}"
CenterX="{Binding Path=CompositeTransformProperties.CenterX, Mode=TwoWay}"
CenterY="{Binding Path=CompositeTransformProperties.CenterY, Mode=TwoWay}"
TranslateX="{Binding Path=CompositeTransformProperties.TranslateX, Mode=TwoWay}"
TranslateY="{Binding Path=CompositeTransformProperties.TranslateY, Mode=TwoWay}"
/>
</Image.RenderTransform>
</Image>
Zastanawiam się czy w ogóle jest sens tworzenia ViewModel dla tego zadania i nie chlapnąć wszystkiego w klasie widoku.