3

我的shellView中有一个顶级菜单,选择子菜单时,我想在shellViewModel(conteror.collection.allactive)上调用以下方法。

    public void SelectServer(string pServerName)
    {
        mDefaultClaimServer = pServerName;
    }

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

    <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>

以下确实调用了 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>

我已经为此苦苦挣扎了很长时间,无法弄清楚。有人可以建议我可以将子 MenuItem 的标题文本传递给 ShellViewModel SelectServer 方法的正确组合吗?

4

1 回答 1

10

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

如果有人有建议,我仍然很想知道如何使用标准 OOTB 逻辑来做我想做的事情,以便我能够更好地理解 CM。

基本上我将它添加到引导程序 Configure() overide -

        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;
        });

并将其添加到 xaml -

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

然后我收到了我想要的子菜单项的标题文本。

于 2012-07-01T22:06:53.023 回答