如何在 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 中捕获从子组件到父组件的激活命令?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Angular中将表单数据从子组件传输到父组件

如何在 Reactjs 中将数据从子组件传递到父组件? [复制]

如何在Angular 4中将值从子组件传递到父组件

React Hooks - 如何将道具从子组件传递到父组件?

将变量从子组件传递到父组件

如何使用双向数据绑定将数据从子组件传递到父组件?