刚刚随便写了个测试,这两种方法对我都可以:
使用完整语法:
<TextBox Name="Threshold"
Margin="5"
Grid.Column="1">
<i:Interaction.Triggers>
<i:EventTrigger EventName="KeyDown">
<cal:ActionMessage MethodName="ExecuteFilterView">
<cal:Parameter Value="$executionContext"/>
</cal:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
使用 CM 语法(我更喜欢它,因为它更易读)
<TextBox Name="Threshold"
Margin="5"
Grid.Column="1"
cal:Message.Attach="[Event KeyDown] = [Action ExecuteFilterView($executionContext)]" />
这是测试虚拟机:
public class MainWindowViewModel
{
public void ExecuteFilterView(ActionExecutionContext context)
{
}
}
你能发布你的完整代码吗?你确定你已经正确设置了框架吗?(你是否按照入门示例进行了操作?)
http://caliburnmicro.codeplex.com/wikipage?title=Basic%20Configuration%2c%20Actions%20and%20Conventions&referringTitle=Documentation
编辑:
好的,在您澄清之后,我可以给您一些如何实现此操作的示例-我会告诉您我的个人偏好和原因,但请选择最适合您的方法
- 使用
ActionExecutionContext
并转换事件参数:
cal:Message.Attach="[Event KeyDown] = [Action ExecuteFilterView($executionContext)]"
public void ExecuteFilterView(ActionExecutionContext context)
{
var keyArgs = context.EventArgs as KeyEventArgs;
if (keyArgs != null && keyArgs.Key == Key.Enter)
{
}
}
使用
EventArgs
直接。
cal:Message.Attach="[Event KeyDown] = [Action ExecuteFilterView($eventArgs)]"
public void ExecuteFilterView(KeyEventArgs keyArgs)
{
if (keyArgs.Key == Key.Enter)
{
}
}
我的个人最爱,是创建自己的
SpecialValues
字典条目:
在你的
Bootstrapper.Configure
方法中...
MessageBinder.SpecialValues.Add("$pressedkey", (context) =>
{
var keyArgs = context.EventArgs as KeyEventArgs;
if (keyArgs != null)
return keyArgs.Key;
return null;
});
你的行动:
cal:Message.Attach="[Event KeyDown] = [Action ExecuteFilterView($pressedKey)]"
而且这段代码:
public void ExecuteFilterView(Key key)
{
if (key == Key.Enter)
{
}
}
这是我喜欢的原因吗?这意味着您的虚拟机只接收您想要的值(大多数情况下,您不关心许多其他参数),您不需要知道如何或烦扰地转换事件参数 - 您可以直接操作该值。显然,使用最适合您的方法。 还值得注意的是,如果您有其他类型的控件子类,它们会继承 KeyEventArgs ,则它们也将适用于此。 如果它们不是 KeyEventArgs 的子类,但仍返回 Key 类型的值,则这仍将起作用,因为如果第一个失败,您可以在委托中添加另一个强制转换:
MessageBinder.SpecialValues.Add("$pressedkey", (context) =>
{
var keyArgs = context.EventArgs as KeyEventArgs;
if (keyArgs != null)
return keyArgs.Key;
var thirdPartyKeyArgs = context.EventArgs as ThirdPartyKeyArgs;
if (thirdPartyKeyArgs != null)
return thirdPartyKeyArgs.KeyProperty;
return null;
});
MessageBinder.SpecialValues
,因为它抽象了实际的事件参数转换,并提供了一种漂亮可重用的方法来处理此问题。我将在帖子中更新所有选项。 - CharlehKeyEventArgs
),您需要在 VM 中进行强制转换或检查。这就是使用特殊值的原因,以抽象掉那一层间接性。 - Charleh