ボタンをMouseEventCommandクラスに渡します。
私のコマンドクラスはここにあります
public static class MouseEnterCommand
{
public static ICommand GetCommand(Button button)
{
return button.GetValue(CommandProperty) as ICommand;
}
public static void SetCommand(Button button, ICommand command)
{
button.SetValue(CommandProperty, command);
}
public static readonly DependencyProperty CommandProperty =
DependencyProperty.RegisterAttached(
"Command",
typeof (ICommand),
typeof (MouseEnterCommand),
new PropertyMetadata(OnSetCommandCallback));
public static void OnSetCommandCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs eventArgs)
{
Button button = dependencyObject as Button;
if (button != null)
{
MouseEnterChangedBehavior behavior = GetOrCreateObject(button);
behavior.Command = eventArgs.NewValue as ICommand;
}
}
private static MouseEnterChangedBehavior GetOrCreateObject(Button button)
{
MouseEnterChangedBehavior behavior = button.GetValue(MouseEnterCommandBehaviorProperty) as MouseEnterChangedBehavior;
if (behavior == null)
{
behavior = new MouseEnterChangedBehavior(button);
button.SetValue(MouseEnterCommandBehaviorProperty, behavior);
}
return behavior;
}
private static readonly DependencyProperty MouseEnterCommandBehaviorProperty =
DependencyProperty.RegisterAttached(
"MouseEnterCommandBehavior",
typeof (object),
typeof (MouseEnterCommand),
null);
public static ICommand GetCommandParameter(Button button)
{
return button.GetValue(CommandParameterProperty) as ICommand;
}
public static void SetCommandParameter(Button button, object parameter)
{
button.SetValue(CommandParameterProperty, parameter);
}
public static readonly DependencyProperty CommandParameterProperty =
DependencyProperty.RegisterAttached(
"CommandParameter",
typeof(object),
typeof(MouseEnterCommand),
new PropertyMetadata(OnSetCommandParameterCallback));
public static void OnSetCommandParameterCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs eventArgs)
{
Button button = dependencyObject as Button;
if (button != null)
{
MouseEnterChangedBehavior behavior = GetOrCreateObject(button);
behavior.Command = eventArgs.NewValue as ICommand;
}
}
}
public class MouseEnterChangedBehavior:CommandBehaviorBase<Button>
{
public MouseEnterChangedBehavior(Button targetObject)
: base(targetObject)
{
targetObject.MouseEnter += OnMouseEnter;
}
private void OnMouseEnter(object sender, MouseEventArgs e)
{
ExecuteCommand();
}
}
私のSilverlightコードはここにあります
<Button Width="250"
Height="60"
Content="MyButton with MouseEnter"
commands:MouseEnterCommand.Command="{Binding MouseEnterCommand}"
commands:MouseEnterCommand.CommandParameter="{Binding RelativeSource={RelativeSource Self}}"
/>
そして私のModevビューはこのようなものです
public class MouseEnterViewModel
{
private ICommand mouseEnterCommand;
public ICommand MouseEnterCommand
{
get
{
if(mouseEnterCommand==null)
{
mouseEnterCommand =new DelegateCommand<object>(OnButtonMouseEnter);
}
return mouseEnterCommand;
}
}
public void OnButtonMouseEnter(object obj)
{
// !!!!!!! obj is coming null ????????????????
}
}
私の問題は、objオブジェクトがNullになることです。
MouseEnterCommandクラスでポイントを壊し、ボタンがここに来て、ExecuteCommandが正常に機能していることを確認しました。しかし、モデルビューでは、objはnullになります。