【问题标题】:How can a Caliburn.Micro sub menuitem click call an action on the containing view's viewmodel?Caliburn.Micro 子菜单项如何单击在包含视图的视图模型上调用操作?
【发布时间】:2012-07-01 03:54:18
【问题描述】:

我在shellview中有一个顶级菜单,选择子menuiuem时,我想在shellviewmodel上调用以下方法(指挥.Collective.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 方法的正确组合吗?

【问题讨论】:

  • 不会让 Menu 触发 SelectionChanged 或也不会绑定 SelectedItem 属性。
  • Derek - 我正在尝试通过使用 CM 机制(并尝试学习 CM)来避免与事件相关的代码。
  • 当然可以,但是可以为此使用一个操作。
  • 我可以很好地调用操作,但找不到传递给我 MenuItem 文本的参数(我尝试将 Text 作为参数,但我的操作被调用但参数为空)。我尝试了我能想到的。你知道哪个会做到吗?我在 CM 还是很新,只有下面的工作。可能只是做错了......

标签: menuitem caliburn.micro


【解决方案1】:

根据 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)" />

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

【讨论】:

    猜你喜欢
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    相关资源
    最近更新 更多