silverlight命令事件回调对象

时间:2012-10-06 06:55:18

标签: wpf silverlight binding command prism

我将按钮传递给我的MouseEventCommand类。

我的Command类在这里

    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();
    }
}

我的银光代码在这里

        <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对象即将来临。

我在MouseEnterCommand类中断点,我看到按钮来了,ExecuteCommand运行良好。但是在模型视图中,obj将变为空。

1 个答案:

答案 0 :(得分:0)

您可以检查在OnMouseEnter事件处理程序中调用的ExecuteCommand方法。您没有从该位置进一步传递发件人对象。

验证是否应将sender对象作为输入参数传递给ExecuteCommand()

public class MouseEnterChangedBehavior:CommandBehaviorBase<Button>
{
    public MouseEnterChangedBehavior(Button targetObject) 
        : base(targetObject)
    {
        targetObject.MouseEnter += OnMouseEnter;
    }

    private void OnMouseEnter(object sender, MouseEventArgs e)
    {  // check if you can pass sender object as input to this method
        ExecuteCommand();
    }
}