2012-01-24 52 views
3

我使用Caliburn micro作为我的WPF项目。静态菜单很容易与卡利结合Caliburn micro的动态菜单

<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动作方法在菜单视图模型上触发(你现在可以产生reuturn IResults类型)..这可能吗?

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

编辑:忘了提及,我已经解决了上述结合部,

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

但我不知道如何倾听来自点击模型

回答

7

最好办法是增加你自己的消息粘结剂

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)" 
+0

对不起,但我到底在哪里添加'cal:Message.Attach =“ShowSettings($ originalsourcecontext)”'?它在''?但如果是这样,那么“插件”菜单将是可点击的,我只希望它的孩子可以点击。 – JobaDiniz

+2

请看这里https://github.com/AndersMalmgren/FreePIE/blob/master/FreePIE.GUI/Views/Main/MainMenuView.xaml#L62 – Anders

0

(对不起我的英文不好)

你可以调用一个方法especific在VMü唱语法(在你的XAML):

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

+0

MenuItem没有这个事件..我做了类似的事情,但上下文是错误的,我有一个线程在Codeplex http://caliburnmicro.codeplex.com/discussions/287228 – Anders