我有一个视图模型(AbstractContextMenu)代表我的上下文菜单(IContextMenu),我绑定一个真正的文本菜单将其与一个DataTemplate:我可以使用DataTemplate将ContextMenu应用于ContextMenuViewModel吗?
<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; }
}
我用它作为其他视图模型对象的属性:
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到视图模型,并在StackPanel中ContextMenu属性绑定到视图模型的ContextMenu属性:
<StackPanel Orientation="Horizontal"
ContextMenu="{Binding Path=(local:AbstractSolutionItem.ContextMenu)}"
ContextMenuOpening="stackPanel_ContextMenuOpening">
<!-- stuff goes in here -->
</StackPanel>
当我运行此,上的StackPanel中的ContextMenuOpening事件被激发,但文本菜单是NE显示。我不确定我是否可以执行此操作(使用DataTemplate将ContextMenu应用于ContextMenu ViewModel)。有人知道吗?
嗨安迪。 WPF可以识别我为AbstractMenuItem定义的DataTemplate,它确实创建了菜单(毕竟是MVVM的核心),但正如你所说,似乎我不能将StackPanel.ContextMenu属性绑定到一个随机对象并让WPF将我的DataTemplate应用到它。我希望有办法解决这个问题,但看起来我的选择是零。谢谢。太糟糕了 - 我试图去完整的MVVM,但很难。 – 2010-02-27 04:30:41
这并没有真正解决我的问题,但由于看起来没有解决方案,我想要做什么,这是“正确的”。 ;) – 2010-02-28 13:47:54