我是Caliburn Micro的新手,并从this helloworld example了解它。在该示例中,只有2个类型为Application和UserControl的视图(.xaml)和1个视图模型。
我避免使用后面的代码。因此我只有查看和查看模型。我想知道如何捕获我的helloworld应用程序的窗口关闭事件,以便我可以在视图模型中处理它。我的目标:当用户通过按右上角的[x]按钮关闭应用程序时,应用程序会向用户提供反馈。
我已阅读有关IViewAware和IScreen的内容,但我没有找到与我的问题相关的具体示例。
非常感谢视图和视图模型的简单示例代码。提前谢谢。
PS。我使用VS2013,C#。
答案 0 :(得分:10)
您可以在View
中使用
Caliburn Micro
cal:Message.Attach="[Event Closing] = [Action OnClose($eventArgs)]"
所以它看起来像
<Window cal:Message.Attach="[Event Closing] = [Action OnClose($eventArgs)]">
在ViewModel
上,您可以定义一个公共方法,其中OnClose
以CancelEventArgs
为参数,您可以从那里处理它。
答案 1 :(得分:3)
如果您的ViewModel继承了Screen,Caliburn Micro有一些您可以覆盖的方法,如
protected override void OnDeactivate(bool close);
当屏幕关闭或停用或
时调用此方法public override void CanClose(Action<bool> callback)
您可以查看CanClose使用情况here
答案 2 :(得分:1)
您正在寻找将事件绑定到命令的方法。这里的典型方法是使用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,它是System.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教条你不能拥有任何代码&#34;被击落time | and |再次time(最后一个链接特别相关)。 MVVM应该是可单元测试的,并且分离了&#34; View逻辑&#34;来自&#34;业务逻辑。&#34; &#34;关闭&#34;事件无疑是View和Business逻辑之间的一个灰色区域。但是,如果您可以在后面的代码中编写一个事件处理程序,它会调用您的ViewModel的相应方法或命令,并且如果您可以对该代码进行单元测试,那么您就像黄金一样好。不要担心从项目中删除所有代码隐藏的痕迹。
答案 3 :(得分:0)
如果使用的是BootstrapperBase类,则可以使用:
protected override void OnExit(object sender, EventArgs e)