2010-05-14 3 views

ответ

-1

Слушайте события MouseDoubleClick в отделенном коде от просмотра и вызвать соответствующий метод на ViewModel:

public class MyView : UserControl 
{ 
    ... 

    private MyViewModel ViewModel { get { return DataContext as MyViewModel; } } 

    private void ListView_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
    { 
     ViewModel.OpenSelectedItem(); 
    } 
+0

Это не соответствует шаблону MVVM. –

2

Я предпочитаю добавлять MouseDoubleClickBehaviour, а затем вы можете прикрепить его к любому контролю, который будет связываться с вашей ViewModel. Вызов команд из кода Кода создает прямые зависимости, которые мне не нравятся.

public static class MouseDoubleClickBehaviour 
{ 
    public static readonly DependencyProperty CommandProperty = 
     DependencyProperty.RegisterAttached("Command", typeof(ICommand), typeof(MouseDoubleClickBehaviour), new UIPropertyMetadata(null, OnCommandChanged)); 

    public static readonly DependencyProperty CommandParameterProperty = 
     DependencyProperty.RegisterAttached("CommandParameter", typeof(object), typeof(MouseDoubleClickBehaviour), new UIPropertyMetadata(null)); 

    public static ICommand GetCommand(DependencyObject obj) 
    { 
     return (ICommand)obj.GetValue(CommandProperty); 
    } 

    public static void SetCommand(DependencyObject obj, ICommand value) 
    { 
     obj.SetValue(CommandProperty, value); 
    } 

    public static object GetCommandParameter(DependencyObject obj) 
    { 
     return obj.GetValue(CommandParameterProperty); 
    } 

    public static void SetCommandParameter(DependencyObject obj, object value) 
    { 
     obj.SetValue(CommandParameterProperty, value); 
    } 

    private static void OnCommandChanged(DependencyObject target, DependencyPropertyChangedEventArgs args) 
    { 
     var grid = target as Selector; 

     ////Selector selector = target as Selector; 
     if (grid == null) 
     { 
      return; 
     } 

     grid.MouseDoubleClick += (a, b) => GetCommand(grid).Execute(grid.SelectedItem); 
    } 
} 

Затем вы можете сделать это в XAML

<ListView ... 
    behaviours:MouseDoubleClickBehaviour.Command="{Binding Path=ItemSelectedCommand}" 
    behaviours:MouseDoubleClickBehaviour.CommandParameter="{Binding ElementName=txtValue, Path=Text}" 
.../> 
+0

Не могли бы вы добавить обработчик для двойного щелчка мыши на объект, который не был выбран MouseDoubleClick селектора в текстовом блоке, например? –