【问题标题】:Binding an Action to an Checkbox Checked event inside a MenuItem template将操作绑定到 MenuItem 模板内的 Checkbox Checked 事件
【发布时间】:2019-11-23 10:29:31
【问题描述】:

我目前正在尝试使用 Caliburn.Micro 创建一个 MediaPlayer。 在我的 ShellView 中,我有一个包含“文件”、“编辑”和“类别”的 MenuItems 的菜单。 Categories MenuItem 有List<CategoryModel> 作为ItemSource。 MenuItem 有一个设置为 Checkbox 的 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 中的复选框。

【问题讨论】:

  • ChangeSelectedPlaylist 定义在哪里,它是ShellViewModel 的一部分吗?可以分享一下方法吗? ShellView 是一个窗口,它的数据上下文是ShellViewModel 吗?

标签: c# wpf xaml data-binding caliburn.micro


【解决方案1】:

由于您在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>

【讨论】:

  • 非常感谢。问题是 ShellView 是一个用户控件。我用 Window 替换了它,并且使用您的代码,它就像一个魅力!
【解决方案2】:

您在 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>

【讨论】:

    猜你喜欢
    • 2010-12-06
    • 1970-01-01
    • 2011-07-28
    • 2017-12-10
    • 2014-11-04
    • 2012-04-09
    • 2011-01-07
    • 1970-01-01
    • 2021-12-01
    相关资源
    最近更新 更多