2

我有一个从实例创建的树视图ItemsSourceSecondViewModel与我的 Window DataContext 不同。

我想通过`CommandParameter 发送属于 TreeViewItem 的 ViewModel。

窗口数据上下文是:MyViewModel。treeviewitems 数据上下文是:SecondViewModel

我想通过SecondViewModel而不是MyViewModel

所以,

CommandParameter ="{Binding}" 

不起作用(因为它会发送MyViewModel

编辑:一些代码:

 <TreeView Name="treeView" ItemContainerStyle="{StaticResource TreeViewItemStyle}"  Grid.Row="1" Grid.Column="1">
        <TreeViewItem Header="{Binding ProjectName}">
            <TreeViewItem commandBehaviors:MouseDoubleClick.Command="{Binding SelectOtherTab}" 
                          commandBehaviors:MouseDoubleClick.CommandParameter="{Binding}" //this returns the data context of the window, I want to return the Item Source
                ContextMenu="{StaticResource AddClassMenu}" ItemTemplate="{DynamicResource ClassDataTemplate}" ItemsSource="{Binding ClassCollection}">

我怎样才能发送SecondViewModel

编辑:

我想启用删除当前项目,但由于某种原因该命令永远不会被调用。

这是代码:

<TreeViewItem x:Name="treeViewItem"
                ContextMenu="{StaticResource AddClassMenu}" ItemTemplate="{DynamicResource ClassDataTemplate}" ItemsSource="{Binding ClassCollection}">
                <TreeViewItem.ItemContainerStyle>
                    <Style TargetType="TreeViewItem">
              HERE->>          <Setter Property="ContextMenu" Value="{StaticResource RemoveClassMenu}"/>
                        <Setter Property="commandBehaviors:MouseDoubleClick.Command" 
        Value="{Binding ElementName=treeViewItem, Path=DataContext.SelectOtherTab}" />
                        <Setter Property="commandBehaviors:MouseDoubleClick.CommandParameter" 
        Value="{Binding }" />
                    </Style>
</TreeViewItem>

我的上下文菜单:

 <ContextMenu x:Key="RemoveClassMenu">
    <MenuItem Header="Delete" Command="{Binding ElementName=treeViewItem, Path=DataContext.RemoveClass}" CommandParameter="{Binding}"/>
</ContextMenu>

如前所述,该命令永远不会被调用。我的代码有什么问题?

4

2 回答 2

3

我认为你要做的是DoubleClick对你的孩子设置你的命令TreeViewItems,而不是你的父母TreeViewItem设置ItemsSource

现在您的 XAML 说要构建一个父TreeViewItem级,并在其下TreeViewItemsClassCollection. 当您双击父级TreeViewItem然后运行SelectOtherTab命令时,没有任何内容可以指定TreeViewItem单击了哪个子级。

这是您现在拥有的 XAML 的简化视图。

<TreeView x:Name="treeView">
    <TreeViewItem OnDoubleClick="SelectOtherTab"> <!-- Parent TreeViewItem -->
        <TreeViewItem /><!-- Child TreeViewItems -->
        <TreeViewItem />
        <TreeViewItem />
        ...
    </TreeViewItem>
</TreeView>

相反,您希望将CommandandCommandParameter属性附加到每个 child TreeViewItem,如下所示:

<TreeViewItem.ItemContainerStyle>
  <Style TargetType="TreeViewItem">
    <Setter Property="commandBehaviors:MouseDoubleClick.Command" 
            Value="{Binding ElementName=treeView, Path=DataContext.SelectOtherTab}" />
    <Setter Property="commandBehaviors:MouseDoubleClick.CommandParameter" 
            Value="{Binding }" />
  </Style>
</TreeViewItem.ItemContainerStyle>

这将使您的简化 XAML 看起来像这样:

<TreeView x:Name="treeView">
    <TreeViewItem> <!-- Parent TreeViewItem -->
        <TreeViewItem OnDoubleClick="SelectOtherTab" /><!-- Child TreeViewItems -->
        <TreeViewItem OnDoubleClick="SelectOtherTab"/>
        <TreeViewItem OnDoubleClick="SelectOtherTab" />
        ...
    </TreeViewItem>
</TreeView>

我仍然有点困惑为什么你有一个父母并且正在使用它TreeViewItem来构建孩子,但是如果这不是必需的,你可以通过消除这样的父母来简化你的 VisualTree :TreeViewItemsItemsSourceTreeViewItem

<TreeView Name="treeView" 
          ItemsSource="{Binding ClassCollection}"
          ItemContainerStyle="{StaticResource TreeViewItemStyle}"  
          Grid.Row="1" Grid.Column="1">
    <TreeView.Resources>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="Header" Value="ProjectName" />
            <Setter Property="ContextMenu" Value="{StaticResource AddClassMenu}" />
            <Setter Property="ItemTemplate" Value="{DynamicResource ClassDataTemplate}" />

            <Setter Property="commandBehaviors:MouseDoubleClick.Command" 
                    Value="{Binding ElementName=treeView, Path=DataContext.SelectOtherTab}" />
            <Setter Property="commandBehaviors:MouseDoubleClick.CommandParameter" 
                    Value="{Binding }" />
        </Style>
    </TreeView.Resources>
</TreeView>

这将使您的 TreeView 看起来像这样:

<TreeView x:Name="treeView">
    <TreeViewItem OnDoubleClick="SelectOtherTab" />
    <TreeViewItem OnDoubleClick="SelectOtherTab"/>
    <TreeViewItem OnDoubleClick="SelectOtherTab" />
    ...
</TreeView>
于 2012-12-29T19:19:03.613 回答
0

您必须在 MyViewModel 中声明 SecondViewModel 类型的属性。然后您也可以将数据绑定到内部项目。

CommandParameter ="{绑定 SecondViewModelProp.CommandParam}"

如果命令参数在 SecondViewModelProp 中定义。

如果我理解错了,请告诉我。

 public class MyViewModel
 {
    public SecondViewModel  SecondViewModelProp
    {
        get { return new SecondViewModel(); }
    }

   public MyViewModel()
   {

   }
 }
于 2012-12-28T21:20:47.690 回答