1

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

Listbox 代码嵌入在页面中,此页面为视图模型实例设置 DataContext。

  DataContext="{Binding Source={StaticResource Locator},Path=CategoryDetails}">

我了解到上下文菜单不是可视化树的一部分,并且不能直接重用数据上下文。问题是,我也有一个带有相同上下文菜单的 MemoTemplate,我想在这里重用我的视图模型。谁能给我一个提示来解决它?

我尝试使用 ContextService 参数并设置代理。但是我的 View 命令不是通过上下文菜单调用的。

我如何在此处重用我的页面(通过列表框)中的视图模型实例?

提前感谢比约恩

4

1 回答 1

3

DataContext甚至可以从ContextMenu. 只是PlacementTarget用来路由你Binding的。

不确定你在哪里View声明了这个命令,所以我将描述这两种方法。

1: View命令属于的ItemSource类型TListBox换句话说,它在形成的子元素的类中ListBox

非常简单,我们将 设置为DataContextContextMenu它相同的PlacementTargetGrid

...
<Grid.ContextMenu>
  <ContextMenu DataContext="{Binding RelativeSource={RelativeSource Self}, Path=PlacementTarget.DataContext}">
    <MenuItem Command="{Binding Path=View}">
      <MenuItem.Header>
    ...

2:如果View命令在虚拟机CategoryDetails中作为Items属性的兄弟。

通过这种方法,我们将VM的DataContextof the 设置为附加到的元素的 the。现在在里面我们绑定到'sListBoxCategoryDetailsTagGridContextMenuContextMenuMenuItem.CommandContextMenuPlacementTarget.Tag.View

...
<Grid Margin="5 10 10 5"
              Tag="{Binding RelativeSource={RelativeSource FindAncestor,
                                                           AncestorType={x:Type ListBox}},
                            Path=DataContext}">
          <Grid.ContextMenu>
            <ContextMenu>
              <MenuItem Command="{Binding Path=PlacementTarget.Tag.View, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}">
...

Tag如果您不想Tag用于此,您可以用附加属性替换。

于 2013-07-14T11:50:51.620 回答