我有列表视图,我想在有人双击任何位置时显示新窗口。但是我有 mvvm 应用程序,我不想在 xaml 文件后面的代码中有任何功能,例如:如何绑定命令以双击 DataGrid 中的一行以及许多其他类似的示例。我想在 viewmodel 文件中有方法并像这样绑定它:
<ListView ... MouseDoubleClick="{Binding myfunction}">
谢谢
我有列表视图,我想在有人双击任何位置时显示新窗口。但是我有 mvvm 应用程序,我不想在 xaml 文件后面的代码中有任何功能,例如:如何绑定命令以双击 DataGrid 中的一行以及许多其他类似的示例。我想在 viewmodel 文件中有方法并像这样绑定它:
<ListView ... MouseDoubleClick="{Binding myfunction}">
谢谢
这是基于列表中单击的项目触发命令(在 ViewModel 中)的方法的工作示例。ViewModel 中的命令将获取“单击”项作为其参数。
我正在使用 Textblock.InputBindings,它可能是 Blachshma 链接的Blend SDK的一部分,但您不需要任何其他 DLL 即可工作。
在我的示例中,ViewModel 绑定到 UserControl 的 DataContext,这就是为什么我需要使用RelativeSource FindAncestor从我的 TextBlock 中查找 ViewModel。
编辑:通过将TextBlock的Width绑定到ListBox的ActualWidth来修复宽度问题。
只是一个问题,即使列表本身更宽,双击也只会在您单击文本块中的文本时起作用。
<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>
您可以使用附加属性来绑定您想要的任何事件。
对于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);
}
}
}
在 Xaml 中:
<ListBox Behavior:MouseDoubleClick.Command="{Binding ....}"
Behavior:MouseDoubleClick.CommandParameter="{Binding ....}"/>
最简单的方法是使用System.Windows.Interactivity
和Microsoft.Expression.Interactions
(都可以通过Blend SDK免费获得)
因此,首先将以下命名空间添加到您的视图中
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
接下来,捕获 DoubleClick 事件并将其传递给命令:
<ListView ..... >
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<local:EventToCommand Command="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DataContext.myfunction}" />
</i:EventTrigger
</i:Interaction.Triggers>
</ListView>
注意:EventToCommand
使用的是MVVM Light Toolkit中的一个,可以在这里下载。它的作用是myFunction
在事件触发后立即执行命令 ( )。
myFunction
这是基于命令位于 ListView 用户的 DataContext 中的假设。否则,将 EventToCommand 的绑定修改为命令所在的位置。