Как должны происходить зависимые от положения мыши действия в модели MVVM?
У меня есть приложение, которое имеет поверхность для рисования, где действия пользователя сильно коррелируют с положением курсора мыши. Для примера, скажем, я пытаюсь реализовать вставку. В этом случае вставленные данные должны быть размещены примерно в центре области просмотра с точки зрения пользователя.
Тем не менее, такая концепция, как "область просмотра" - это проблема представления, а не проблема модели представления. Но действие для вставки является заботой о моделях представления, а не заботой о представлении.
Как этот сценарий должен быть разработан для систем MVVM?
1 ответ
Поскольку отсутствует свойство положения мыши, вы можете связать (для которого вы бы использовали Mode=OneWayToSource
), вы могли бы послушать MouseMove
событие:
private void OnMouseMove(object sender, MouseEventArgs e)
{
myViewModel.MousePosition = e.GetPosition(this);
}
Прежде чем вы скажете, что это не MVVM, потому что он использует код позади, с http://msdn.microsoft.com/en-us/library/gg405484(v=pandp.40).aspx
В некоторых случаях программный код может содержать логический код пользовательского интерфейса, который реализует визуальное поведение, которое трудно или неэффективно выразить в расширяемом языке разметки приложений (XAML), например в сложных анимациях, или когда коду необходимо напрямую манипулировать визуальными элементами, которые часть зрения. Вы не должны помещать какой-либо логический код в представление, которое вам нужно для модульного тестирования. Как правило, логический код в выделенном коде представления будет тестироваться с помощью подхода автоматизации тестирования пользовательского интерфейса.
Как указывалось, другим методом может быть использование CallMethodAction для привязки вызовов событий к вызову метода в вашей ViewModel:
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity
xmlns:ei="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactions
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseMoved">
<ei:CallMethodAction TargetObject={Binding} MethodName="OnMouseMoved"/>
</i:EventTrigger>
</i:Interaction.Triggers>
Однако я предпочитаю не использовать привязку здесь, так как событие будет вызываться очень часто, и привязка будет включать в себя больше накладных расходов.