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

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

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

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

Решение?

Ответы на вопрос(3)

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

<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonDown">
<cmd:EventToCommand Command="{Binding MouseCommand, PassEventArgsToCommand="True", CommandParameter="{Binding}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
 TigOldBitties29 нояб. 2013 г., 20:12
Вы забыли упомянуть, что это использует смесь

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

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

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

Тренировать новичка через базовый WPF? (Я не впадаю в это.)

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

 Dani O.25 янв. 2011 г., 22:13
Большое спасибо, было именно то, что мне было нужно. Теперь я лучше понимаю модель MVVM.

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

Вы можете найти версию библиотеки классов для Windows Store 8 и настольного приложения для Windows здесь. Вы хотите 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>

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

Ваш ответ на вопрос