Обработка событий мыши на элементах управления с шаблоном MVVM - лучшие практики - - PullRequest
5 голосов
/ 22 июня 2010

На самом деле я нашел 2 способа обработки событий мыши на элементах управления с шаблоном mvvm.

Оба способа на самом деле 1 способ:

MVVM Light Toolkit от http://mvvmlight.codeplex.com/

<i:Interaction.Triggers>
    <i:EventTrigger EventName="SelectionChanged">
        <cmd:EventToCommand
            Command="{Binding SelectionChangedCommand}"
            CommandParameter="{Binding SelectedItems,
                ElementName=MyDataGrid}" />
    </i:EventTrigger>
</i:Interaction.Triggers>

и Blend interactivity.dll с поведением

<i:Interaction.Triggers>
  <i:EventTrigger EventName=”MouseLeftButtonDown”>
    <Behaviours:ExecuteCommandAction Command=”{Binding MyCommand}” CommandParameter=”{Binding MyCommandParameter}”/>
  </i:EventTrigger>
</i:Interaction.Triggers>

Знаете ли вы какой-нибудь лучший метод?

Модератор: какого черта мои последние 6 строк кода xaml вообще не видны? Они проглатываются браузером IE и Iron. Не могли бы вы сообщить администратору, чтобы исправить этот код сценария? это не работает вообще очень часто. доказать: http://img251.imageshack.us/img251/5236/errorxt.png

Ответы [ 3 ]

7 голосов
/ 22 июня 2010

Это оба хороших способа сделать это, если вам нужно обрабатывать MouseDown в произвольных местах.

Однако, как правило, таких ситуаций мало и они далеко друг от друга.Обычно есть более простой способ:

  • Вы уверены, что ваши объекты на самом деле не кнопки, которые просто не похожи на кнопки?Если это так, сделайте их настоящими объектами Button и сделайте так, чтобы они выглядели так, как вы хотите.
  • Вы уверены, что ваши объекты - это просто области выбора объектов в списке?Если это так, измените контейнер с ItemsControl на ListBox и измените стиль ListBoxItem, чтобы использовать области выделения.
  • Являются ли выбранные вами пути графическими объектами?Используйте ToggleButton, содержимым которого является сам путь.

Есть много других примеров этого.На самом деле, редко встречается ситуация, когда MouseDown отображается на Command, и нет более чистого способа сделать то же самое.

6 голосов
/ 26 июня 2010

Всегда есть другой вариант.Вы можете обрабатывать события WPF в выделенном фрагменте кода View и вызывать соответствующий метод в ViewModel.Шаблон MVVM не запрещает записывать какой-либо код в файл выделенного кода представления.

Пример ViewModel приложения WPF Application Framework (WAF) показывает, как это может работать.

1 голос
/ 28 апреля 2014

XCommand Проект с открытым исходным кодом имеет лучший способ справиться с привязкой Command / CommandParameter на основе событий.Найдите здесь, xcommand.codeplex.com

Вот пример кода ниже:

<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>

Надеюсь, это будет полезно.

...