アタッチされた動作を使用する必要があります。デモンストレーションの目的で、MVVM と ICommand パターンを使用してボタンのダブルクリックを実装したいとします。関連するコードは次のとおりです。
まず、次のような ButtonBehaviors という静的クラスを作成します。
public static class ButtonBehaviors
{
public static object GetButtonDoubleClick(DependencyObject obj)
{
return obj.GetValue(ButtonDoubleClickProperty);
}
public static void SetButtonDoubleClick(DependencyObject obj, object value)
{
obj.SetValue(ButtonDoubleClickProperty, value);
}
public static readonly DependencyProperty ButtonDoubleClickProperty =
DependencyProperty.RegisterAttached("ButtonDoubleClick", typeof (object), typeof (ButtonBehaviors),
new UIPropertyMetadata(new PropertyChangedCallback(OnButtonDoubleClickChanged)));
private static void OnButtonDoubleClickChanged (DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var button = d as Button;
if(button == null)
{
return;
}
var command = e.NewValue as ICommand;
if(command == null)
{
return;
}
button.MouseDoubleClick += (o, ev) => command.Execute(button);
}
}
(1秒で説明します)
次に、これを使用する方法は次のとおりです。
MainWindow.xaml:
<Window x:Class="WpfApplication3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:WpfApplication3="clr-namespace:WpfApplication3" Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Content="Button"
Height="23"
HorizontalAlignment="Left"
Margin="173,89,0,0"
VerticalAlignment="Top"
WpfApplication3:ButtonBehaviors.ButtonDoubleClick="{Binding ButtonDoubleClick}"
Width="75" />
</Grid>
</Window>
最後に、ViewModel:
public class ViewModel
{
private ICommand _buttonDoubeClick;
public ICommand ButtonDoubleClick
{
get
{
if (_buttonDoubeClick == null)
{
_buttonDoubeClick = new SimpleDelegateCommand(() => MessageBox.Show("Double click!!"));
}
return _buttonDoubeClick;
}
}
}
完全を期すために、サードパーティのdllはここにないと言ったので、私のSimpleDelegateCommandは次のとおりです。
public class SimpleDelegateCommand : ICommand
{
private readonly Action _action;
public SimpleDelegateCommand(Action action)
{
_action = action;
}
public bool CanExecute(object parameter)
{
return true;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
if(_action != null)
{
_action();
}
}
}
何が起こっているかを簡単に言うと、Command を添付プロパティに割り当てると、OnButtonDoubleClickChanged イベントが発生し、その時点で button.MouseDoubleClick イベントに接続します。