如何在Caliburn.Micro子菜单项上单击调用包含视图的viewmodel上的操作?

Dav*_*ave 3 menuitem caliburn.micro

我在ShellView中有一个顶级菜单,当选择子MenuItem时,我想在ShellViewModel(Conductor.Collection.AllActive)上调用以下方法.

    public void SelectServer(string pServerName)
    {
        mDefaultClaimServer = pServerName;
    }
Run Code Online (Sandbox Code Playgroud)

以下不起作用,因为没有方法被调用(我已经尝试了各种签名和动作参数) -

    <Menu Name="menu1" DockPanel.Dock="Top">
        <MenuItem Header="Select Server" Name="ClaimServers">
            <MenuItem.ItemTemplate>
                <DataTemplate>
                    <!-- we need this else we show the class name -->
                    <TextBlock Text="{Binding DisplayName}">
                        <ContentControl cal:Message.Attach="[Event Click] = [Action TxTester.ShellViewModel.SelectServer($Text)]"/>
                    </TextBlock>
                </DataTemplate>
            </MenuItem.ItemTemplate>
        </MenuItem>
    </Menu>
Run Code Online (Sandbox Code Playgroud)

以下确实调用了ShellViewModel SelectServer方法,但是对于单击的子MenuItem的文本我得到null(我还尝试了许多其他签名和操作参数) -

    <Menu Name="menu1" DockPanel.Dock="Top">
        <MenuItem Header="Select Server" Name="ClaimServers" cal:Message.Attach="SelectServer($this.Text)">
            <MenuItem.ItemTemplate>
                <DataTemplate>
                    <!-- we need this else we show the class name -->
                    <TextBlock Text="{Binding DisplayName}" />
                </DataTemplate>
            </MenuItem.ItemTemplate>
        </MenuItem>
    </Menu>
Run Code Online (Sandbox Code Playgroud)

很长一段时间我一直在苦苦挣扎,无法弄明白.有人可以建议正确的组合,我可以将子MenuItem的标题文本传递给ShellViewModel SelectServer方法吗?

Dav*_*ave 9

根据Rob Eisenberg的一篇文章描述了"从绑定子菜单中获取文本的特殊技巧",我得到了我想要做的工作 - http://caliburnmicro.codeplex.com/discussions/287228

如果有人有建议的话,我仍然想知道如何用标准OOTB逻辑做我想做的事情,这样我就能更好地理解CM.

基本上我把它添加到bootstrapper Configure()上面 -

        MessageBinder.SpecialValues.Add("$originalsourcecontext", context =>
        {
            var args = context.EventArgs as RoutedEventArgs;
            if (args == null)
                return null;

            var fe = args.OriginalSource as FrameworkElement;
            if (fe == null)
                return null;

            return fe.DataContext;
        });
Run Code Online (Sandbox Code Playgroud)

并将此添加到xaml -

        <MenuItem Header="_Select Server" Name="ClaimServers" cal:Message.Attach="SelectServer($originalsourcecontext)" />
Run Code Online (Sandbox Code Playgroud)

然后我传递了sub menuitem的标题文本,这是我想要的.