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

Posted

技术标签:

【中文标题】Caliburn.Micro 子菜单项如何单击在包含视图的视图模型上调用操作?【英文标题】:How can a Caliburn.Micro sub menuitem click call an action on the containing view's viewmodel? 【发布时间】: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 还是很新,只有下面的工作。可能只是做错了...... 【参考方案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)" />

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

【讨论】:

以上是关于Caliburn.Micro 子菜单项如何单击在包含视图的视图模型上调用操作?的主要内容,如果未能解决你的问题,请参考以下文章

C#:Caliburn Micro:如何使用数据绑定控制 WPF 按钮的属性?

Caliburn.Micro 点击事件查找图像点并计算距离

Caliburn Micro + RowDetailsTemplate:详细信息视图消失

C# WPF MVVM开发框架Caliburn.Micro常用功能指南②

使用 caliburn micro 和 fluent 验证通过按钮进行验证

关于使用 Caliburn.Micro MVVM WPF 进行视图导航的建议