Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Caliburn.微导体:触发/动作触发超过exptected_C#_Silverlight_Silverlight 5.0_Caliburn.micro - Fatal编程技术网

C# Caliburn.微导体:触发/动作触发超过exptected

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 问题是: 当进入主视图并返回登

我正在尝试编写一个非常简单的示例应用程序,但它并没有按预期工作

以下是场景:

Caliburn.Micro、MVVM、Silverlight 5.0-简单导航中的简单导体示例

我只是举了一个活生生的例子:

ShellViewModel 上面的示例运行良好,单击Login按钮后显示Login视图,单击Master显示Master视图

在登录视图中有一个文本框,其中有一个事件触发器。点击Enter键后,它从viewmodel调用一个方法并显示一个messagebox

问题是: 当进入主视图并返回登录端时,按Enter键-它会显示消息框两次

转到master,然后再返回->它将显示3倍。。等等


我想扳机应该只开一次。我们如何实现这种行为?

我认为这是因为每次加载视图时都会执行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");
    }