2

Window DataContextとは異なり、インスタンスItemsSourceから作成されたツリービューがあります。SecondViewModel

TreeViewItemに属するViewModelを`CommandParameter経由で送信したい。

ウィンドウデータコンテキストは次のとおりMyViewModelです。treeviewitemsデータコンテキストは次のとおりです。SecondViewModel

合格したいのですSecondViewModelMyViewModel

したがって、

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の子の束を作成します。親をダブルクリックしてからコマンドを実行しますが、どの子がクリックされたかを指定することはできません。TreeViewItemsClassCollectionTreeViewItemSelectOtherTabTreeViewItem

これが、現在使用しているXAMLの簡略化されたビューです。

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

代わりに、次のようにCommandCommandParameterプロパティを各子 にアタッチします。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 = "{Binding SecondViewModelProp.CommandParam}"

コマンドパラメータがSecondViewModelProp内で定義されている場合。

何か間違っていることがわかったら教えてください。

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

   public MyViewModel()
   {

   }
 }
于 2012-12-28T21:20:47.690 に答える