Caliburn micro的动态菜单

And*_*ers 3 data-binding wpf menubar caliburn.micro

我在我的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>  
Run Code Online (Sandbox Code Playgroud)

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

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

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

public BindableCollection<PluginMenuViewModel> Plugins { get; set; }
Run Code Online (Sandbox Code Playgroud)

但我不知道如何从模型中听取点击

And*_*ers 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;
});
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样从xaml中使用它

cal:Message.Attach="ShowSettings($originalsourcecontext)"
Run Code Online (Sandbox Code Playgroud)

  • 请看这里https://github.com/AndersMalmgren/FreePIE/blob/master/FreePIE.GUI/Views/Main/MainMenuView.xaml#L62 (2认同)