将 Action 绑定到 MenuItem 模板中的 Checkbox Checked 事件

Binding an Action to an Checkbox Checked event inside a MenuItem template

我目前正在尝试使用 Caliburn.Micro 创建一个 MediaPlayer。 在我的 ShellView 中,我有一个带有 'File'、'Edit' 和 'Categories' 菜单项的菜单。 类别菜单项具有 List<CategoryModel> 作为 ItemSource。 MenuItem 有一个设置为复选框的 ItemTemplate。

<Menu DockPanel.Dock="Top">
        <MenuItem Header="_File">
            <MenuItem Header="_Close" x:Name="Close"/>
        </MenuItem>
        <MenuItem Header="Edit">
            <MenuItem Header="Settings"/>
            <MenuItem Header="MediaData"/>
            <Separator/>
            <MenuItem Header="Reset"/>
        </MenuItem>
        <MenuItem Header="Categories" ItemsSource="{Binding AvailableCategories}">
            <MenuItem.ItemTemplate>
                <DataTemplate>
                    <CheckBox Content="{Binding DisplayText}" cal:Message.Attach="[Event Checked] = [Action ChangeSelectedPlaylist($dataContext)]"/>
                </DataTemplate>
            </MenuItem.ItemTemplate>
        </MenuItem>
    </Menu>

现在我希望 Caliburn 在我的 ShellViewModel 中调用一个方法。但是它总是说找不到方法ChangeSelectedPlaylist的目标。

现在我已经阅读了 Visual Trees 和 caliburns 'TargetWithoutContext' 但我无法运行 指定的方法。

我找到的所有示例都使用了 ContextMenus 和 ItemsControl。这似乎不适用于 MenuItems 中的复选框。

您在使用 TargetWithoutContext 方面走在了正确的轨道上。

<CheckBox Content="{Binding DisplayText}"  cal:Message.Attach="ChangeSelectedPlaylist($datacontext)"
                                 cal:Action.TargetWithoutContext="{Binding DataContext, ElementName=mainMenu}" />

其中 "mainMenu" 是菜单控件的名称。完整代码

<Menu DockPanel.Dock="Top" cal:Action.TargetWithoutContext="{Binding DataContext, RelativeSource={RelativeSource Self}}" x:Name="mainMenu">
            <MenuItem Header="_File">
                <MenuItem Header="_Close" x:Name="Close"/>
            </MenuItem>
            <MenuItem Header="Edit">
                <MenuItem Header="Settings"/>
                <MenuItem Header="MediaData"/>
                <Separator/>
                <MenuItem Header="Reset"/>
            </MenuItem>
            <MenuItem Header="Categories" ItemsSource="{Binding AvailableCategories}">
                <MenuItem.ItemTemplate>
                    <DataTemplate>
                        <CheckBox Content="{Binding DisplayText}"  cal:Message.Attach="ChangeSelectedPlaylist($datacontext)"
                                 cal:Action.TargetWithoutContext="{Binding DataContext, ElementName=mainMenu}" />
                    </DataTemplate>
                </MenuItem.ItemTemplate>
            </MenuItem>
        </Menu>

因为您在 ShellViewModel 中定义了 ChangeSelectedPlaylist 方法,您应该使用 TargetWithoutContext 绑定到元素,其中 ShellViewModel 设置为 DataContext .如果是 Window,xaml 应该是这样的

<DataTemplate>
     <CheckBox Content="{Binding DisplayText}" 
               cal:Message.Attach="ChangeSelectedPlaylist($datacontext)"
               cal:Action.TargetWithoutContext="{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
</DataTemplate>