我的ShellView中有一个顶级菜单,当选择子MenuItem时,我想在ShellViewModel上调用以下方法(一个Conductor.Collection.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方法吗?
答案 0 :(得分:8)
我得到了我想要做的工作,根据Rob Eisenberg的一篇文章描述了“从绑定子菜单中获取文本的特殊技巧” - http://caliburnmicro.codeplex.com/discussions/287228
如果有人有建议,我仍然想知道如何做标准OOTB逻辑我想做的事情,这样我就能更好地理解CM。
基本上我将它添加到bootstrapper 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)" />
然后我传递了sub menuitem的标题文本,这就是我想要的。