У меня есть Button внутри MenuItem.Header вот так:
<Menu>
<MenuItem>
<MenuItem.Header>
<Button>Hello</Button>
</MenuItem.Header>
<MenuItem Header = "SubItem1"/>
<MenuItem Header = "SubItem2"/>
</MenuItem>
</Menu>
если я щелкну MenuItemза пределамиButton, откроется подменю. Но если я нажму на Button, подменю не откроется. Я считаю, что это потому, что событие нажатия не передается на MenuItem. Как мне это исправить?
Короче - хочу, чтобы при нажатии на Button открывалось подменю.
(Используется в основном для стилизации, у меня есть стиль кнопки, и я хочу использовать его как MenuItem)





Button не знает, как расширить MenuItem, если вы не сообщите ему, как это сделать, написав код:
<Menu>
<MenuItem>
<MenuItem.Header>
<Button Click = "Button_Click">Hello</Button>
</MenuItem.Header>
<MenuItem Header = "SubItem1"/>
<MenuItem Header = "SubItem2"/>
</MenuItem>
</Menu>
private void Button_Click(object sender, RoutedEventArgs e)
{
Button btn = (Button)sender;
MenuItem mi = btn.Parent as MenuItem;
if (mi != null)
mi.IsSubmenuOpen = !mi.IsSubmenuOpen;
}
«Передать событие родителю» без написания кода? Конечно нет. Кроме того, то, как раскрывается MenuItem, не является обязанностью модели представления. Это чисто функциональные возможности, основанные на просмотре.
Звучит логично, но мне сказали, что в MVVM представление должно быть только в XAML, и вам не следует писать код позади. Это плохая парадигма?
Это не правда. MVVM не об устранении кода связанный с просмотром из представлений. Речь идет о разделении забот. Фактически, вы могли бы программно написать все представление, не нарушая шаблон MVVM, если бы захотели. Но это другая история, не имеющая ничего общего с вашим первоначальным вопросом.
ОК! Спасибо за просветление.
Я предполагаю, что это сработает, но я хочу избежать использования кода для поддержки шаблона архитектуры MVVM. Нет ли общего решения передать событие родителю?