我对WPF中的DataContext问题感到疯狂。我在StackOverflow中阅读了这里的评论,但我无法修复它。
我有以下数据模板:
<DataTemplate x:Key="TodoTemplate" >
<Grid Margin="5 10 10 5" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="30" MaxWidth="30"/>
<ColumnDefinition Width="30" MaxWidth="30"/>
<ColumnDefinition Width="30" MaxWidth="30"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.ContextMenu>
<ContextMenu>
<MenuItem Command="{Binding Path=View}">
<MenuItem.Header>
<WrapPanel>
<Label Margin="30 0 0 0" Background="LightBlue">View Item</Label>
</WrapPanel>
</MenuItem.Header>
</MenuItem>
以及我想重用我的模板的列表框:
<ListBox Grid.Row="4" ItemsSource="{Binding Path=Items}" Margin="10" ItemTemplateSelector="{StaticResource categoryItemSelector}" SelectedItem="{Binding Path=CurrentItem,Mode=TwoWay}" MouseDoubleClick="ListBox_MouseDoubleClick" >
</ListBox>
列表框代码嵌入在页面中,此页面为视图模型实例设置DataContext。
DataContext="{Binding Source={StaticResource Locator},Path=CategoryDetails}">
我了解到上下文菜单不是可视树的一部分,数据上下文无法直接重用。问题是,我还有一个具有相同上下文菜单的MemoTemplate,我想在这里重用我的视图模型。任何人都可以给我一个暗示来解决它吗?
我尝试使用ContextService参数并设置代理。但我的View命令不是通过上下文菜单调用的。
我如何在我的页面(通过列表框)重用我的视图模型实例?
提前致谢 的Björn
答案 0 :(得分:2)
您甚至可以从DataContext
引用ContextMenu
罚款。只需使用PlacementTarget
路由您的Binding
。
不确定您在哪里声明了此View
命令,因此我将描述这两种方法。
1: View
命令属于ItemSource
的{{1}}类型T
(换句话说,它位于形成的类中ListBox
)的子元素
非常简单,我们设置ListBox
的{{1}}与DataContext
ContextMenu
相同。
PlacementTarget
2:如果Grid
命令在VM ...
<Grid.ContextMenu>
<ContextMenu DataContext="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget.DataContext}">
<MenuItem Command="{Binding Path=View}">
<MenuItem.Header>
...
中作为View
属性的兄弟。
通过这种方法,我们将CategoryDetails
的{{1}} Items
VM设置为DataContext
元素的ListBox
CategoryDetails
附加到。现在在Tag
内,我们将Grid
绑定到ContextMenu
的{{1}}
ContextMenu
如果您不想使用MenuItem.Command
,可以将ContextMenu
替换为附加属性。