WPF DataTemplate使用与父控件相同的DataContext

时间:2013-07-14 11:14:26

标签: wpf viewmodel datatemplate datacontext

我对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

1 个答案:

答案 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替换为附加属性。