如何在 WPF 中捕获从子组件到父组件的激活命令?
Posted
技术标签:
【中文标题】如何在 WPF 中捕获从子组件到父组件的激活命令?【英文标题】:How to catch activated command from child component to parent component in WPF? 【发布时间】:2018-09-21 05:38:04 【问题描述】:我有一个包含主菜单的 MainWindow。菜单是一个用户控件,由一个内部带有按钮的 StackPanel 组成。
简化的 XAML 代码如下:
<Window>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="200" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<local:MainMenu Grid.Column="0"></local:MainMenu> <!-- the navigation menu -->
<ContentControl Grid.Column="1" Content="Binding CurrentView" />
</Grid>
</Window>
<!-- The navigation menu UserControl -->
<UserControl Class="MyApp.MainMenu" ...etc... >
<StackPanel>
<Button Style="StaticResource menuButton">To do</Button>
<Button Style="StaticResource menuButton">Notes</Button>
<Button Style="StaticResource menuButton">Settings</Button>
<Button Style="StaticResource menuButton">News</Button>
<Button Style="StaticResource menuButton">Calendar</Button>
<Button Style="StaticResource menuButton">...</Button>
<Button Style="StaticResource menuButton">...</Button>
<Button Style="StaticResource menuButton">...</Button>
</StackPanel>
</UserControl>
当然,当单击菜单 UserControl 中的按钮时,我想通知 MainWindow 用户想要导航。 MainWindow 必须更改其CurrentView
属性。显示相应的视图。
我遇到的问题是我无法在组件之间进行任何通信。在 WPF 中实现这一点似乎非常困难。互联网上有 教程,但它们没有很好地解释如何以正确的方式进行操作。 我认为将 Click 事件处理程序添加到 MainMenu 的每个按钮是一个坏主意。我想使用命令来解决这个问题,并使用命令参数来确定点击了什么按钮,如果这是好的做法。
在最理想的情况下,是否可以让菜单只是“发出”事件之类的东西,而窗口会捕捉到它?这样子控件(菜单 UserControl)就不必知道它的父控件。
有人可以帮我吗?
【问题讨论】:
【参考方案1】:犯了一个错误并查看我的答案。 ContextMenu 不在同一个“上下文”中,并且绑定不容易工作 - 我使用 Forward 命令概念,因此 menutiem 命令被转发到 MainViewModel - 如果您需要更多,请告诉我,请参阅我的项目 CBR 并搜索 ForwardCommand
【讨论】:
【参考方案2】:有很多方法可以做到这一点。如果您使用的是 MVVM,您可以只进行命令绑定,如果您在 MainWindow 视图模型中说 ExitApp 命令,那么您可以这样做:
<vw:ImgButton Name="Exit" ClickCommand="Binding DataContext.ExitApp, RelativeSource=RelativeSource AncestorType=x:Type Window,Mode=OneWay"/>
您可以选择在命令参数中提供信息,也可以在 ExitApp 命令中进行切换。
【讨论】:
以上是关于如何在 WPF 中捕获从子组件到父组件的激活命令?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Reactjs 中将数据从子组件传递到父组件? [复制]