あなたはMVVMをやっている場合は、分離コードとの間のギャップを埋めることができますあなたのビューモデルを通常通りに - 添付された動作を使用して:
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
public sealed class HandleDoubleClickBehavior
{
public static readonly DependencyProperty CommandProperty = DependencyProperty.RegisterAttached(
"Command", typeof (ICommand), typeof (HandleDoubleClickBehavior), new PropertyMetadata(default(ICommand), OnComandChanged));
public static void SetCommand(DependencyObject element, ICommand value)
{
element.SetValue(CommandProperty, value);
}
public static ICommand GetCommand(DependencyObject element)
{
return (ICommand) element.GetValue(CommandProperty);
}
public static readonly DependencyProperty CommandParameterProperty = DependencyProperty.RegisterAttached(
"CommandParameter", typeof (object), typeof (HandleDoubleClickBehavior), new PropertyMetadata(default(object)));
public static void SetCommandParameter(DependencyObject element, object value)
{
element.SetValue(CommandParameterProperty, value);
}
public static object GetCommandParameter(DependencyObject element)
{
return (object) element.GetValue(CommandParameterProperty);
}
private static void OnComandChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var c = d as Control;
if (c == null)
throw new InvalidOperationException($"can only be attached to {nameof(Control)}");
c.MouseDoubleClick -= OnDoubleClick;
if (GetCommand(c) != null)
c.MouseDoubleClick += OnDoubleClick;
}
private static void OnDoubleClick(object sender, MouseButtonEventArgs e)
{
var d = sender as DependencyObject;
if (d == null)
return;
var command = GetCommand(d);
if (command == null)
return;
var parameter = GetCommandParameter(d);
if (!command.CanExecute(parameter))
return;
command.Execute(parameter);
}
}
これでツールボックスは、あなたがこのようなXAMLを(PersonViewModel
は、文字列プロパティName
とTitle
、および文字列パラメータを期待しSayHiCommand
という名前ICommand
プロパティが含ま仮定して)書き込むことができます。
<ListView ItemsSource="{Binding Persons}" >
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="local:HandleDoubleClickBehavior.Command" Value="{Binding SayHiCommand}" />
<Setter Property="local:HandleDoubleClickBehavior.CommandParameter" Value="{Binding Name}" />
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
<GridViewColumn Header="Title" DisplayMemberBinding="{Binding Title}" />
</GridView>
</ListView.View>
</ListView>
出典
2016-03-01 23:33:32
dlf
歓声Meleakを、これはうまく動作します! – thumbmunkeys
@pivotnig:喜んで聞いてください:) –