我正在使用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中定义的目标函数吗?可能是范围相关的问题吗?
提前致谢, 干杯, 詹卢卡。
答案 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); }
}