У меня есть ViewModel (AbstractContextMenu), который представляет мое контекстное меню (IContextMenu), и я связываю реальный ContextMenu к нему с DataTemplate:Могу ли я применить ContextMenu к ContextMenuViewModel с помощью 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 пе ver отображается. Я не уверен, могу ли я это сделать (примените ContextMenu к ContextMenu ViewModel с помощью DataTemplate). Кто-нибудь знает?
Привет Энди. WPF распознает DataTemplate I, определенный для AbstractMenuItem, и он действительно создает меню просто отлично (это в основе MVVM), но, как вы сказали, кажется, я не могу просто привязать свойство StackPanel.ContextMenu к случайному объекту и WPF применит мой DataTemplate к нему. Я надеялся найти способ обойти это, но похоже, что мои варианты ноль. Благодарю. Слишком плохо - я пытаюсь пройти полный MVVM, но это сложно. –
Это действительно не помогло решить мою проблему, но, похоже, что нет решения для того, что я хотел сделать, это «правильный». ;) –