将 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>
我目前正在尝试使用 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>