- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将事件与 Caliburn Micro 绑定(bind),但在向该方法获取正确消息时遇到一些问题。我想添加在更改文本框中的值后按“Enter”键的功能,并且它执行与旁边的按钮绑定(bind)的相同方法。但是,无论按下哪个键,我都会遇到以下异常:
A first chance exception of type 'System.InvalidCastException'occurred in MyApp.exe
A first chance exception of type'System.Reflection.TargetInvocationException' occurred in mscorlib.dll
A first chance exception of type'System.Reflection.TargetInvocationException' occurred inWindowsBase.dll
根据另一个类似问题的建议Binding KeyDown Event Silverlight ,我尝试过使用 ActionExecutionContext,但没有成功。
这是 xaml:
<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>
方法:
public void ExecuteFilterView(ActionExecutionContext context)
{
//Do stuff...
}
我知道我可能可以省去一些麻烦,只需在后面的代码中执行一个标准事件处理程序,但这个应用程序是 MVVM 中的一个练习,并学习使用 Caliburn.Micro,所以我想坚持制作这个特定方法的工作。
我是否只是想发送事件中的错误信息?我的 xaml 编码是否正确,无法获得我想要的内容?或者我完全错过了其他东西?
最佳答案
刚刚进行了测试,这两个都对我有用:
使用完整语法:
<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)
{
// This method is hit and the context is present and correct
}
}
您可以发布完整的代码吗?您确定框架设置正确吗? (您遵循入门示例了吗?
编辑:
好的,在您澄清之后,我可以给您一些如何执行此操作的示例 - 我会告诉您我的个人偏好和原因,但请选择最适合您的一个
ActionExecutionContext
并转换 eventargs: 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)
{
// Do Stuff
}
}
EventArgs
cal:Message.Attach="[Event KeyDown] = [Action ExecuteFilterView($eventArgs)]"
public void ExecuteFilterView(KeyEventArgs keyArgs)
{
if (keyArgs.Key == Key.Enter)
{
// Do Stuff
}
}
SpecialValues
字典条目:在您的 Bootstrapper.Configure
方法中...
MessageBinder.SpecialValues.Add("$pressedkey", (context) =>
{
// NOTE: IMPORTANT - you MUST add the dictionary key as lowercase as CM
// does a ToLower on the param string you add in the action message, in fact ideally
// all your param messages should be lowercase just in case. I don't really like this
// behaviour but that's how it is!
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)
{
// Do Stuff
}
}
为什么这是我最喜欢的?这意味着您的虚拟机只接收您想要的值(大多数时候您不关心许多其他参数),并且您不需要知道如何或费心去转换 eventargs - 您只需操作即可关于值(value)。显然使用最适合你的东西
还值得注意的是,如果您有其他类型的控件子类 KeyEventArgs
这也适用于它们。如果它们没有子类 KeyEventArgs
但它们仍然返回 Key
类型的值,这仍然可以工作,因为如果第一个失败,您可以向委托(delegate)添加另一个强制转换:
例如
MessageBinder.SpecialValues.Add("$pressedkey", (context) =>
{
var keyArgs = context.EventArgs as KeyEventArgs;
if (keyArgs != null)
return keyArgs.Key;
// Ok so it wasn't KeyEventArgs... check for some other type - maybe a 3rd party implementation
var thirdPartyKeyArgs = context.EventArgs as ThirdPartyKeyArgs;
if (thirdPartyKeyArgs != null)
return thirdPartyKeyArgs.KeyProperty;
return null;
});
关于wpf - Caliburn Micro 'Enter' 关键事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16719496/
所以我在 Caliburn.Micro 上摆弄了一下,突然发现了一些有趣的东西。 我有一个名为 Maximum 的 ViewModel 属性,类型为 int,通过命名约定与 CM 自动绑定(bind)
如果我的 View 中有一个名为 Save 的按钮,那么我可以将 Save 属性添加到我的 ViewModel,Caliburn.Micro 会自动将它绑定(bind)到我的按钮的内容。例如: pub
我将 ViewModels 绑定(bind)到 ContentControls 并让 Caliburn 负责创建和绑定(bind) View 。但是,我想根据我绑定(bind)的 ContentCon
我一直在尝试将 Caliburn.Micro MVVM 框架集成到我处于中间位置的 C# WPF 项目中。 我目前只有三个 View 模型: ShellViewModel -(带有 ContentCo
Caliburn.Micro 是否有与 Catel's 类似的功能? [ExposeAttribute] ? 有没有其他方法可以减轻 Caliburn.Micro 中传递属性的工作? (即模型中的属性
我这样做: 问题是,这同时是主窗口上定义的主导体,我用它控制通过其他窗口的导航,所以我不能从 MetroWindow 继承,至少尝试更改 ViewModel 中的标题: public class S
我知道,没有办法直接在 Amazon 上从 t1.micro 迁移到 t2.micro。 那么,它会工作吗: 从当前 t1 中分离 EBS 卷 创建新的 t2.micro 实例 将 EBS vol 附
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
我已在 MongoDb 配置文件中启用分析。 profile=2 slowms=5 mongodb 日志包含所有耗时超过 5 毫秒的查询(奇怪,我认为 profile=2 意味着记录所有查询)。 对于
我试图弄清楚如何成功地让 Caliburn Micro 在 Windows Phone 8.1 应用程序中从一个页面导航到另一个页面。 我的第一页加载得很好,正如我的 App 类中所指定的: prot
我尝试使用 Google 的 UI 在我的集群中启动一个新的 f1-micro 节点,但它默默地失败了。所以我决定使用 gcloud 运行它,看看它是否提供了更多细节 所以我运行了以下 gcloud
我正在使用 Arduino Micro 在我拥有的前端触发特定事件。然而,出于某种原因,一些关键组合只是随机触发。发生这种情况时,我什至没有接触 arduino。 我已经设置好了,当你按下一个按钮时,
我刚刚开始开发一个简单的 Restful 服务。我的文件夹结构如下: root - /api --/api/customers.php 例如,在浏览器中我打算调用http://domain/api/c
我有一些包含一定数量不同字符串的文件(大约 100.000 个取自产品)。需要找出处理该文件中每个字符串的函数的 99%、99.9%。 我尝试使用jmh来编写基准测试。但是,我只能找到批处理函数(处理
有没有办法在android中检测micro sd卡?我知道 Environment 类提供了外部存储的详细信息。但它只是提供了内置 SD 卡的详细信息。有办法解决吗? 最佳答案 您可以使用 isExt
问题是关于将 go-micro 包装器用作单独的服务 - 如果有人知道如何正确使用它,请告诉我。我的例子 - authWrapper,所以所有的 api 服务都应该能够使用它,它应该通过标准服务发现来
我有 Angular 6 微前端应用程序。它在主应用程序中有 4 个不同的应用程序。我如何在这些应用程序之间实现路由。我如何在主应用程序(我在主应用程序中有很多子路由)和子应用程序中实现路由。我正在使
我正在开发一个使用 Caliburn Micro 的 WPF 项目。我遇到了一个问题,即第二次打开 View 时, View 中的控件没有得到更新。第一次数据绑定(bind)工作正常。 当我第二次调用
在我的 WPF Caliburn.Micro 应用程序中,我有一个 TabControl。我希望能够根据需要关闭标签。我在这里找到了一种方法: http://devlicio.us/blogs/rob
我有一个使用WPF应用程序的场景,该应用程序托管一些带有其视图模型的视图(用户控件),这些视图模型是MEF在其插件文件夹中导出的部件。该应用程序将其数据与配置文件一起加载,该文件还指示应在可用零件中导
我是一名优秀的程序员,十分优秀!