C# Caliburn.微导体:触发/动作触发超过exptected
我正在尝试编写一个非常简单的示例应用程序,但它并没有按预期工作 以下是场景: Caliburn.Micro、MVVM、Silverlight 5.0-简单导航中的简单导体示例 我只是举了一个活生生的例子: ShellViewModel 上面的示例运行良好,单击Login按钮后显示Login视图,单击Master显示Master视图 在登录视图中有一个文本框,其中有一个事件触发器。点击Enter键后,它从viewmodel调用一个方法并显示一个messagebox 问题是: 当进入主视图并返回登录端时,按Enter键-它会显示消息框两次 转到master,然后再返回->它将显示3倍。。等等C# Caliburn.微导体:触发/动作触发超过exptected,c#,silverlight,silverlight-5.0,caliburn.micro,C#,Silverlight,Silverlight 5.0,Caliburn.micro,我正在尝试编写一个非常简单的示例应用程序,但它并没有按预期工作 以下是场景: Caliburn.Micro、MVVM、Silverlight 5.0-简单导航中的简单导体示例 我只是举了一个活生生的例子: ShellViewModel 上面的示例运行良好,单击Login按钮后显示Login视图,单击Master显示Master视图 在登录视图中有一个文本框,其中有一个事件触发器。点击Enter键后,它从viewmodel调用一个方法并显示一个messagebox 问题是: 当进入主视图并返回登
我想扳机应该只开一次。我们如何实现这种行为?我认为这是因为每次加载视图时都会执行ActivateItem,从而将事件处理程序重新绑定到视图。尝试设置ActiveItem属性,而将x:Name=ActiveItem的ContentControl绑定到该属性。还可以尝试使用公共变量保存视图模型:
public class ShellViewModel : Conductor<object> {
public ShellViewModel() {
ShowLogin();
}
public LoginViewModel { get; set; }
public MasterViewModel { get; set; }
public void ShowLogin() {
ActiveItem = LoginViewModel;
}
public void ShowMaster() {
ActiveItem = MasterViewModel;
}
}
编辑
我能够重现这一点,这似乎是一个表达互动的问题。如果我使用一个常规的EventTrigger连接到key down,它可以正常工作:
<TextBox Width="50" Text="{Binding Message, Mode=TwoWay}" >
<i:Interaction.Triggers>
<!--<iex:KeyTrigger Key="Enter">
<cm:ActionMessage MethodName="Page1KeyPress" />
</iex:KeyTrigger>-->
<i:EventTrigger EventName="KeyDown">
<cm:ActionMessage MethodName="Page1KeyPress" >
<cm:Parameter Value="$source" />
<cm:Parameter Value="$eventArgs" />
</cm:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
public void Page1KeyPress(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
MessageBox.Show("Page 1 Key Press");
}
不幸的是,同样的结果。正如您所建议的,我现在使用属性,并在构造函数+中使用ActiveItem=。。。
public class ShellViewModel : Conductor<object> {
public ShellViewModel() {
LoginModel = new LoginViewModel();
MasterModel = new MasterViewModel();
ShowLogin();
}
public LoginViewModel LoginModel { get; set; }
public MasterViewModel MasterModel { get; set; }
public void ShowLogin() {
ActiveItem = LoginViewModel;
}
public void ShowMaster() {
ActiveItem = MasterViewModel;
}
}
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" x:Class="Hele.ShellView"
d:DesignWidth="438" d:DesignHeight="200">
<Grid>
<StackPanel Orientation="Vertical" HorizontalAlignment="Left" VerticalAlignment="Top">
<Button x:Name="ShowLogin" Width="100" Height="30" Content="Login"/>
<Button x:Name="ShowMaster" Width="100" Height="30" Content="Master"/>
<ContentControl x:Name="ActiveItem" " />
</Grid>
</UserControl>
<UserControl ... >
<Grid x:Name="LayoutRoot">
<StackPanel>
<TextBlock>Login</TextBlock>
<TextBox x:Name="Message" Text="{Binding Message, Mode=TwoWay}" >
<i:Interaction.Triggers>
<iex:KeyTrigger Key="Enter">
<cal:ActionMessage MethodName="Login" />
</iex:KeyTrigger>
</i:Interaction.Triggers>
</TextBox>
</StackPanel>
</Grid>
</UserControl>
public class LoginViewModel : Screen
{
public string Message { get; set; }
public void Login()
{
MessageBox.Show("login messagebox");
}
}
MasterView and MasterViewModel are just empty, nothing interesting there.
public class ShellViewModel : Conductor<object> {
public ShellViewModel() {
ShowLogin();
}
public LoginViewModel { get; set; }
public MasterViewModel { get; set; }
public void ShowLogin() {
ActiveItem = LoginViewModel;
}
public void ShowMaster() {
ActiveItem = MasterViewModel;
}
}
<TextBox Width="50" Text="{Binding Message, Mode=TwoWay}" >
<i:Interaction.Triggers>
<!--<iex:KeyTrigger Key="Enter">
<cm:ActionMessage MethodName="Page1KeyPress" />
</iex:KeyTrigger>-->
<i:EventTrigger EventName="KeyDown">
<cm:ActionMessage MethodName="Page1KeyPress" >
<cm:Parameter Value="$source" />
<cm:Parameter Value="$eventArgs" />
</cm:ActionMessage>
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
public void Page1KeyPress(object sender, KeyEventArgs e)
{
if (e.Key == Key.Enter)
MessageBox.Show("Page 1 Key Press");
}