Caliburn micro的动态菜单

时间:2012-01-24 14:41:22

标签: wpf data-binding caliburn.micro menubar

我在我的WPF项目中使用Caliburn micro。静态菜单很容易与Caliburn

绑定
<Menu Grid.Row="0" IsMainMenu="True">
    <MenuItem Header="_File">
        <MenuItem x:Name="OpenScript" Header="_Open script"/>
    </MenuItem>
    <MenuItem Header="_Script">
        <MenuItem x:Name="RunScript" Header="_Run script" />
        <MenuItem x:Name="StopScript" Header="_Stop script" />
    </MenuItem>
    <MenuItem Header="S_ettings">
        <MenuItem x:Name="Plugins" Header="_Plugins">...Clickable children here</MenuItem>
    </MenuItem>
</Menu>  

名称绑定到模型上的方法,但是对于上面看到的插件菜单,我们需要绑定PluginViewModel的集合。然后,当您单击插件时,我希望在菜单上触发Caliburn操作方法查看模型(你现在可以从那里获得IResults的结果)..这可能吗?

这个问题适用于这个开源项目 https://github.com/AndersMalmgren/FreePIE

编辑:忘了提到我已经解决了绑定部分,

public BindableCollection<PluginMenuViewModel> Plugins { get; set; }

但我不知道如何听取模特中的点击

2 个答案:

答案 0 :(得分:8)

最好的方法是添加自己的邮件活页夹

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一样使用它了

cal:Message.Attach="ShowSettings($originalsourcecontext)"

答案 1 :(得分:0)

(抱歉我的英语不好)

您可以使用语法(在XAML上)在VM上调用特定方法:

cal:Message.Attach="[Event SelectionChanged] = [Action ItemClick($this)]"

这将在VM上调用ItemClick方法,将有界项本身作为参数传递。 如果这是一个带有执行方法的“PluginItem”(就像通常那样),那么在该方法中你只需要调用它:

    public void ItemClick(PluginItem item)
    {
        item.Execute();
    }

您可以在此处详细了解操作:http://caliburnmicro.codeplex.com/wikipage?title=All%20About%20Actions&referringTitle=Documentation