2017-02-22 15 views
0

Я пытаюсь использовать функции взаимодействия для двойного щелчка мыши по стандартным средствам управления изображениями. Элемент управления Image находится в UserControl, и метод, который должен обрабатывать двойной щелчок мыши, находится на модели представления. Код выглядит следующим образом:WPF: Мышь дважды щелкните по изображению, используя взаимодействие

1) UserControl:

<ItemsControl Grid.Row="0" ItemsSource="{Binding SelectedEventPhotoList}" 
      HorizontalAlignment="Stretch" 
      VerticalAlignment="Stretch"     
      Name="SelectedListView"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <UniformGrid Rows="1" Columns="3"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Image Source="{Binding}" Stretch="None"> 
       <i:Interaction.Triggers> 
        <i:EventTrigger EventName="MouseDoubleClick"> 
         <ei:CallMethodAction MethodName="DblClick" TargetObject="{Binding}"/> 
        </i:EventTrigger> 
       </i:Interaction.Triggers> 
      </Image> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

3) Вид модели:

public void DblClick() 
{ 
    MessageBox.Show("Double click!"); 
} 

Но, это не работает.

UPDATE:

Я сделал это, но он не работает:

1) XAML:

<ItemsControl Grid.Row="0" ItemsSource="{Binding SelectedEventPhotoList}" 
      HorizontalAlignment="Stretch" 
      VerticalAlignment="Stretch"     
      Name="SelectedListView"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <UniformGrid Rows="1" Columns="3"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
       <Image Source="{Binding}"> 
        <Image.InputBindings> 
         <MouseBinding MouseAction="LeftDoubleClick" Command="{Binding MouseDoubleClickCommand}"/> 
        </Image.InputBindings> 
       </Image> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

2) Вид модели:

public DelegateCommand MouseDoubleClickCommand { get; private set; } 

В конструкторе :

MouseDoubleClickCommand = new DelegateCommand(DblClick); 

И добавил метод:

public void DblClick() 
{ 
    MessageBox.Show("Double click!"); 
} 

ответ

1

Класс изображения не MouseDoubleClick событие, но вы могли бы использовать InputBinding, который связывается с ICommand собственности:

<Image Source="pic.png"> 
    <Image.InputBindings> 
     <MouseBinding MouseAction="LeftDoubleClick" Command="{Binding MouseDoubleClickCommand}"/> 
    </Image.InputBindings> 
</Image> 

public ICommand MouseDoubleClickCommand { get; } = new DelegateCommand<object>(obj => { MessageBox.Show(""); }); 

Вам нужно будет обеспечить реализацию интерфейса ICommand или использовать кого-то еще «S. DelegateCommand<T> класс доступен в Prism: https://www.nuget.org/packages/Prism.Wpf/

Пожалуйста, обратитесь к следующему сообщению в блоге для получения дополнительной информации о командах и как обрабатывать события, используя шаблон проектирования MVVM: https://blog.magnusmontin.net/2013/06/30/handling-events-in-an-mvvm-wpf-application/

Edit:

Если команда определена в модели представления, то есть DataContext самого ItemsControl, вы должны использовать RelativeSource, чтобы иметь возможность связываться с ней:

<DataTemplate> 
    <Image Source="{Binding}"> 
     <Image.InputBindings> 
      <MouseBinding MouseAction="LeftDoubleClick" 
          Command="{Binding DataContext.MouseDoubleClickCommand, RelativeSource={RelativeSource AncestorType=ItemsControl}}"/> 
     </Image.InputBindings> 
    </Image> 
</DataTemplate> 
+0

Не работает. Пожалуйста, ознакомьтесь с разделом обновления в оригинальном посте, чтобы узнать, что я сделал. – tesicg

+0

Кстати, я использую Призм. – tesicg

+0

См. Мое редактирование. Вероятно, вы должны использовать RelativeSource для привязки к команде. – mm8