Как поймать активированную команду от дочернего компонента к родительскому компоненту в wpf?

У меня есть MainWindow, в котором есть главное меню. Меню представляет собой UserControl, состоящий из 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) не должен знать своего родителя.

Кто-нибудь может мне помочь?

2
0
334
2

Ответы 2

Есть много способов сделать это. Если вы используете MVVM, вы можете просто выполнить привязку команд, если у вас есть команда ExitApp в вашей модели просмотра MainWindow, вы можете сделать это следующим образом:

<vw:ImgButton Name="Exit" ClickCommand="{Binding DataContext.ExitApp, RelativeSource={RelativeSource  AncestorType={x:Type Window}},Mode=OneWay}"/>

При желании вы можете указать информацию в параметре команды, а также выполнить переключение внутри команды ExitApp.

Сделали ошибку и просмотрите мой ответ. ContextMenu не находятся в одном «контексте», и привязка не работает легко - я использую концепцию команды Forward, поэтому команды menutiem перенаправляются в MainViewModel - скажите мне, если вам нужно больше, см. В моем проекте CBR и найдите ForwardCommand

Другие вопросы по теме