WPF и MVVM. Связывающие события - PullRequest
8 голосов
/ 24 января 2011

Я разрабатываю приложение WPF с шаблоном MVVM, RelayCommand и т. Д. Я много читал по этому вопросу, но мне не ясно, как:

Все, что я хочу сделать, это переместить фигуру,например, эллипс и захват его конечной позиции для помещения в базу данных.

Но я не могу связать события (MouseLetButtonDown, MouseLeftButtonUp и MouseMove) с командами.Я читал о прикрепленном поведении, но мне нужны аргументы событий (MouseButtonEventArgs и MouseEventArgs) для получения позиции.

Решение?

Ответы [ 3 ]

8 голосов
/ 25 января 2011

При написании графического приложения MVVM заманчиво попытаться отправить все необходимые события в модель представления. Но обработка аргументов событий мыши в представлении в команде противоречит принципам MVVM и цели слабой связи.

Способ решения этой проблемы состоит в том, чтобы абстрагировать операцию в задачу, которую может выполнить представление, а затем передать ее результаты обратно в модель представления через операции и данные. Если вы хотите выполнить небольшое количество кода в коде для поддержки этого, полиция MVVM не приедет и не заберет ваших детей. Но еще лучший способ - добавить интерактивность в поведение. Поведения - это многократно используемые части функциональности без кода, которые хорошо работают с шаблоном MVVM и приложениями, которым требуется интерактивность, в противном случае потребовалось бы добавить обработчики событий в ваш XAML.

Смотрите мой ответ здесь для полного примера поведения, которое использует события мыши для перетаскивания графических объектов:

С вашей интерактивностью, выполняемой представлением, модель представления может придерживаться данных и команд.

2 голосов
/ 24 января 2011

Это работает для Silverlight, поэтому оно должно работать на WPF (или, по крайней мере, с небольшими изменениями)

<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonDown">
<cmd:EventToCommand Command="{Binding MouseCommand, PassEventArgsToCommand="True", CommandParameter="{Binding}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
0 голосов
/ 28 апреля 2014

Вы можете найти XCommand проект расширения с открытым исходным кодом codeplex wpf здесь, xcommand.codeplex.com , это позволяет вам связывать Command и CommandParameter любых событий, таких как MouseMove, MouseLeftButtonDown, с любымЭлементы пользовательского интерфейса, наследуемые от WPF UIElement.

Здесь вы можете найти версию библиотек классов для windows store 8 и windows desktop application.Вы хотите WPFXCommand, который имеет дело с настольным приложением WPF.Вот как это работает.Добавьте WPFXCommand.dll в качестве ссылки на ваш проект.

Добавьте пространство имен в свой файл xaml, как показано ниже:

xmlns:XCmd="clr-namespace:WPFXCommand;assembly=WPFXCommand"

Теперь вы можете связать Команда и CommandParameter для любых доступных событий в любых элементах пользовательского интерфейса, наследуемых от WPF UIElement, как показано ниже:

    <Grid>
        <TextBlock Margin="20,30,20,0" VerticalAlignment="Top" Height="80" x:Name="XTextBlock"
               Foreground="{Binding FgColor, Mode=TwoWay}"
               XCmd:MouseMove.Command="{Binding TextBlockPointerMovedCommand}"
               XCmd:MouseLeftButtonDown.Command="{Binding TextBlockPointerPressedCommand}"
               XCmd:MouseLeave.Command="{Binding TextBlockPointerExitedCommand}"    
               Text="{Binding Description, Mode=TwoWay}">
        </TextBlock>
        <Grid Grid.Column="1" Background="{Binding BgColor, Mode=TwoWay}"
              XCmd:MouseMove.Command="{Binding GridPointerMovedCommand}" 
              XCmd:MouseMove.CommandParameter="{Binding ElementName=XTextBlock, Path=Text}"
              XCmd:MouseLeftButtonDown.Command="{Binding GridPointerPressedCommand}"
              XCmd:MouseLeftButtonDown.CommandParameter="{Binding ElementName=XTextBlock, Path=Text}"
              >
        </Grid>
    </Grid>

Надеюсь, что этопоможет вам избавиться от кода, основанного на событиях.

...