visual eventos evento derecho c# wpf mvvm

c# - eventos - evento click en visual basic



Cómo enlazar el comando de clic mousedouble en mvvm (3)

Este es un ejemplo práctico de un método para activar un comando (en el modelo de visualización) basado en el elemento seleccionado en una lista. El comando en el ViewModel obtendrá el elemento "pulsado" como su parámetro.

Estoy usando Textblock.InputBindings y eso podría ser parte del Blend SDK vinculado por Blachshma, pero no necesitará ninguna otra DLL para que esto funcione.

En mi ejemplo, el ViewModel está vinculado al DataContext del UserControl, por eso necesito usar el RelativeSource FindAncestor para encontrar el ViewModel de mi TextBlock.

Editar : solucionó el problema de ancho vinculando el ancho del TextBlock al ActualWidth del ListBox .

Solo un problema, el doble clic solo funcionará cuando haga clic dentro del texto en el bloque de texto, incluso si la lista en sí es mucho más amplia.

<ListView ItemsSource="{Binding Model.TablesView}" Grid.Row="1" SelectedItem="{Binding Model.SelectedTable, Mode=TwoWay}" > <ListView.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding Path=.}" Width="{Binding Path=ActualWidth, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListView}}}" > <TextBlock.InputBindings> <MouseBinding MouseAction="LeftDoubleClick" Command="{Binding DataContext.MoveItemRightCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" CommandParameter="{Binding .}"/> </TextBlock.InputBindings> </TextBlock> </DataTemplate> </ListView.ItemTemplate> </ListView>

Tengo vista de lista y quiero mostrar una ventana nueva cuando alguien haga doble clic en cualquier posición. Pero tengo la aplicación mvvm y no quiero tener ninguna función en el código detrás del archivo xaml, como este: cómo enlazar un comando para hacer doble clic en una fila en DataGrid y muchas otras muestras como esta. Quiero tener el método en el archivo viewmodel y enlazarlo así:

<ListView ... MouseDoubleClick="{Binding myfunction}">

Gracias


La forma más fácil de hacer esto es usar System.Windows.Interactivity y Microsoft.Expression.Interactions (ambos disponibles de forma gratuita a través del Blend SDK )

Así que comienza agregando los siguientes espacios de nombres a tu vista

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"

A continuación, capture el evento DoubleClick y páselo al comando:

<ListView ..... > <i:Interaction.Triggers> <i:EventTrigger EventName="MouseDoubleClick"> <local:EventToCommand Command="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DataContext.myfunction}" /> </i:EventTrigger </i:Interaction.Triggers> </ListView>

Nota: el EventToCommand utilizado es el del MVVM Light Toolkit y se puede descargar here . Lo que hace es ejecutar el comando ( myFunction ) tan pronto como se desencadena el evento.

Esto se basa en el supuesto de que el comando myFunction está en el DataContext que los usuarios de ListView. De lo contrario, modifique el enlace de EventToCommand a donde sea que esté el comando.


Puede utilizar Propiedades adjuntas para vincular cualquier evento que desee.

Para MouseDoubleClick :

namespace Behavior { public class MouseDoubleClick { public static DependencyProperty CommandProperty = DependencyProperty.RegisterAttached("Command", typeof(ICommand), typeof(MouseDoubleClick), new UIPropertyMetadata(CommandChanged)); public static DependencyProperty CommandParameterProperty = DependencyProperty.RegisterAttached("CommandParameter", typeof(object), typeof(MouseDoubleClick), new UIPropertyMetadata(null)); public static void SetCommand(DependencyObject target, ICommand value) { target.SetValue(CommandProperty, value); } public static void SetCommandParameter(DependencyObject target, object value) { target.SetValue(CommandParameterProperty, value); } public static object GetCommandParameter(DependencyObject target) { return target.GetValue(CommandParameterProperty); } private static void CommandChanged(DependencyObject target, DependencyPropertyChangedEventArgs e) { Control control = target as Control; if (control != null) { if ((e.NewValue != null) && (e.OldValue == null)) { control.MouseDoubleClick += OnMouseDoubleClick; } else if ((e.NewValue == null) && (e.OldValue != null)) { control.MouseDoubleClick -= OnMouseDoubleClick; } } } private static void OnMouseDoubleClick(object sender, RoutedEventArgs e) { Control control = sender as Control; ICommand command = (ICommand)control.GetValue(CommandProperty); object commandParameter = control.GetValue(CommandParameterProperty); command.Execute(commandParameter); } } }

Y en Xaml:

<ListBox Behavior:MouseDoubleClick.Command="{Binding ....}" Behavior:MouseDoubleClick.CommandParameter="{Binding ....}"/>