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 + RowDetailsTemplate:详细信息视图消失
C# WPF MVVM开发框架Caliburn.Micro常用功能指南②