У меня есть ViewModel (AbstractContextMenu), который представляет мое контекстное меню (IContextMenu), и я привязываю к нему реальное ContextMenu с помощью DataTemplate:
<DataTemplate DataType="{x:Type local:AbstractContextMenu}">
<ContextMenu x:Name="contextMenu"
ItemsSource="{Binding Path=(local:IContextMenu.Items)}"
IsEnabled="{Binding Path=(local:IContextMenu.IsEnabled)}"/>
</DataTemplate>
Тогда у меня есть фиктивный объект ConcreteContextMenu для тестирования, который просто наследуется от AbstractContextMenu. AbstractContextMenu просто реализует этот интерфейс:
public interface IContextMenu : IExtension
{
IEnumerable<IMenuItem> Items { get; set; }
bool IsEnabled { get; set; }
}
Я использую его как свойство другого объекта ViewModel:
public IContextMenu ContextMenu
{
get
{
return m_ContextMenu;
}
protected set
{
if (m_ContextMenu != value)
{
m_ContextMenu = value;
NotifyPropertyChanged(m_ContextMenuArgs);
}
}
}
private IContextMenu m_ContextMenu = new ConcreteContextMenu();
static readonly PropertyChangedEventArgs m_ContextMenuArgs =
NotifyPropertyChangedHelper.CreateArgs<AbstractSolutionItem>(o => o.ContextMenu);
Затем я привязываю StackPanel к этой ViewModel и привязываю свойство ContextMenu на StackPanel к свойству ContextMenu ViewModel:
<StackPanel Orientation="Horizontal"
ContextMenu="{Binding Path=(local:AbstractSolutionItem.ContextMenu)}"
ContextMenuOpening="stackPanel_ContextMenuOpening">
<!-- stuff goes in here -->
</StackPanel>
Когда я запускаю это, событие ContextMenuOpening на StackPanel вызывается, но ContextMenu никогда не отображается. Я не уверен, смогу ли я это сделать (примените ContextMenu к ContextMenu ViewModel, используя DataTemplate). Кто-нибудь знает?