我有listview,当有人双击任何位置时,我想要显示新窗口。但我有mvvm应用程序,我不想在xaml文件后面的代码中有任何函数,像这样:How to bind a Command to double-click on a row in DataGrid和许多其他类似的示例。我希望在viewmodel文件中有方法,并像这样绑定它:
<ListView ... MouseDoubleClick="{Binding myfunction}">
谢谢
发布于 2012-12-25 14:18:44
您可以使用Attached Properties绑定任何您想要的事件。
对于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 ....}"/>
发布于 2012-12-25 04:56:05
最简单的方法是使用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下载的,可以从here下载。它所做的是在事件被触发时立即执行命令(myFunction
)。
这是基于这样的假设:myFunction
命令位于ListView用户的DataContext中。否则,将EventToCommand的绑定修改为命令所在的位置。
https://stackoverflow.com/questions/14025530
复制相似问题