我是Caliburn Micro的新手,并从这个helloworld示例中学习。在该示例中,只有两个类型为Application和UserControl的视图(.xml(和一个视图模型。
我避免使用代码隐藏。所以我只有视图和视图模型。我想知道如何捕捉helloworld应用程序的窗口关闭事件,以便在视图模型中处理它。我的目标:当用户按下右上角的关闭[x]按钮关闭应用程序时,应用程序会向用户提供反馈
我读过关于IViewAware和IScreen的文章,但没有发现与我的问题相关的具体例子。
非常感谢为视图和视图模型提供一个简单的示例代码。提前谢谢。
PS。我使用VS2013,C#。
您可以在View
中使用连接Caliburn Micro
cal:Message.Attach="[Event Closing] = [Action OnClose($eventArgs)]"
所以它看起来像
<Window cal:Message.Attach="[Event Closing] = [Action OnClose($eventArgs)]">
在你的ViewModel
上,你可以定义一个公共方法,用CancelEventArgs
作为参数来表示OnClose
,你可以从那里处理它。
如果您的ViewModel继承了Screen,Caliburn Micro有一些方法可以覆盖,比如
protected override void OnDeactivate(bool close);
当屏幕关闭或停用或时,就会调用此命令
public override void CanClose(Action<bool> callback)
您可以在此处查看CanClose的使用情况
如果您使用BootstrapperBase类,您可以使用:
protected override void OnExit(object sender, EventArgs e)
您正在寻找一种将事件绑定到命令的方法。这里的典型方法是使用MVVMLight中的EventToCommand行为。
示例用法(来自链接文章(:
<StackPanel Background="Transparent">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Tap">
<command:EventToCommand
Command="{Binding Main.NavigateToArticleCommand,
Mode=OneWay,
Source={StaticResource Locator}}"
CommandParameter="{Binding Mode=OneWay}" />
</i:EventTrigger>
</i:Interaction.Triggers>
<!--...-->
</StackPanel>
对于您的特定场景,您没有使用MVVMLight。由于该框架是开源的,您可以将EventToCommand的实现复制到自己的项目中,或者更简单地说,您可以使用InvokeCommandAction,它是系统的一部分。Windows。Interactivity.dll库,包含在Expression Blend中。
InvokeCommandAction:示例
<TextBox x:Name="TicketNumber">
<i:Interaction.Triggers>
<i:EventTrigger EventName="KeyDown">
<i:InvokeCommandAction Command="{Binding OpenTicketCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
最后,你"不能有任何代码"的整个MVVM教条已经被一次又一次地否决了(最后一个链接特别相关(。MVVM应该是可单元测试的,并将"视图逻辑"与"业务逻辑"分开。"关闭"事件无疑是视图和业务逻辑之间的一个灰色地带。但是,如果您可以在代码背后编写一个事件处理程序,它可以调用ViewModel的适当方法或命令,并且您可以对该代码进行单元测试,那么您就如鱼得水了。不要担心从项目中删除所有代码隐藏痕迹。