Я динамически заполняю содержимое StackPanel
в моем приложении, читая файл XML.Каждый потомок StackPanel
сам по себе является другим StackPanel
, который содержит различные UIElement
объекты.Причина вложенного StackPanel
дизайна в том, что я хочу связать один из 3 различных ContextMenu
s с этими дочерними StackPanel
s.
Таким образом, структура выглядит следующим образом:
---- StackPanel parent
|
---- StackPanel child
| |
| ---- TextBlock
|
---- StackPanel child
| |
| ---- TextBox
|
---- StackPanel child
| |
| ---- Image
|
.
.
.
Для каждого StackPanel
ребенка я выбираю из 3 ContextMenu
с и прикрепляю их следующим образом:
var stackPanels = parentStackPanel.Children.OfType<StackPanel>();
for( int i = 0; i < stackPanels.Count(); ++i ) {
if( someCondition ) {
ContextMenuService.SetContextMenu( stackPanels.ElementAt( i ), MyContextMenu1 );
} else if( someOtherCondition ) {
ContextMenuService.SetContextMenu( stackPanels.ElementAt( i ), MyContextMenu2 );
} else {
ContextMenuService.SetContextMenu( stackPanels.ElementAt( i ), MyContextMenu3 );
}
}
Все MenuItem
с по всем 3 ContextMenu
с имеюттот же обработчик Click
.
Теперь, наконец, вопрос: как мне определить, какого StackPanel
ребенка ContextMenu
вызвали и нажали?Проверка объекта отправителя в обработчике кликов в отладчике показывает, что ContextMenu
имеет internal
DependencyObject
с именем Owner
, который содержит ссылку на StackPanel
, это именно то, что я хочу, но, конечно, яне может получить к нему доступ в коде таким образом.
Я мог бы решить эту проблему, добавив обработчик MouseLeftButtonDown
к каждому дочернему элементу StackPanel
, сохранив тот, который был выбран последним, и затем получив его в обработчике ContextMenu
, но это решение выглядит немного уродливо.Есть ли лучший способ сделать это?
Заранее спасибо за помощь!