Galasoft RelayCommand没有开火

时间:2011-03-10 09:00:28

标签: silverlight mvvm mvvm-light relaycommand

我正在使用MVVM Light框架来构建SL4应用程序。我的简单应用程序主要由一个主视图(shellView)组成,它分为多个UserControls。它们只是一个方便的UI分离,因此它们没有自己的ViewModel。

ShellView包含一个包含多个KeypadButtons(自定义用户控件)的键盘(自定义用户控件)。

我非常确定(因为我已经检查过)DataContext设置正确并且它被层次结构中的所有用户控件使用。 (ShellView的Datacontext是ShellViewModel,Keypad的DataContext是ShellViewModel等。)。

在ShellViewModel中,我有一个名为“ProcessKey”的ICommand(RelayCommand)。

在Keypad控件中,我有类似的东西:

<controls:KeypadButton x:Name="testBtn" Text="Hello">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="Click">
                <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding PressStandardKeyCommand}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
</controls:KeypadButton>

KeypadButton基本上是一个包含Button的Grid。捕获MouseLeftButtonUp事件并触发自定义“Click”事件。让我给你看一些代码来轻松解释我在做什么:

public partial class KeypadButton : UserControl
{
    public delegate void KeypadButtonClickHandler(object sender, RoutedEventArgs e);
    public event KeypadButtonClickHandler Click;

public KeypadButton()
{
        // Required to initialize variables
    InitializeComponent();
}

    private void innerButton_Click(object sender, MouseButtonEventArgs e)
    {
        if (Click != null)
            Click(sender, new KeypadButtonEventArgs());
    }
}

public class KeypadButtonEventArgs : RoutedEventArgs
{
    public string test { get; set; }
}

现在,如果我将一个断点设置为innerButton_Click的主体,我可以看到Click被正确捕获并且它包含指向RelayCommand的点。然而,没有任何反应:“点击(发件人,新的KeypadButtonEventArgs());”被执行但仅此而已。

为什么这样做?不应该执行RelayCommand中定义的目标函数吗?可能是范围相关的问题吗?

提前致谢, 干杯, 詹卢卡。

2 个答案:

答案 0 :(得分:1)

正如其他评论所述,这可能与Click事件不是RoutedEvent有关。

作为快速黑客,您可以在MouseLeftButtonDown上使用Click代替UserControl事件。

<!-- Kinda Hacky Click Interception -->
<controls:KeypadButton x:Name="testBtn" Text="Hello">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseLeftButtonDown">
                <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding PressStandardKeyCommand}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
</controls:KeypadButton>

您可以考虑的另一个选项是继承Button而不是UserControl。 Silverlight Show有article about inheriting from a TextBox可能与此相关。

答案 1 :(得分:0)

路由事件应该像这样定义(see documentation):

public static readonly RoutedEvent TapEvent = EventManager.RegisterRoutedEvent(
    "Tap", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyButtonSimple));

// Provide CLR accessors for the event
public event RoutedEventHandler Tap
{
        add { AddHandler(TapEvent, value); } 
        remove { RemoveHandler(TapEvent, value); }
}