2

良い日中。

ContextMenuの作成に問題がありTreeViewます。問題は非常に単純です。treeviewitemでRMBをクリックし、コンテキストメニューコマンドを選択して、treeviewに新しいアイテムを追加したいと思います。
親アイテムを含むパラメーターをコマンドに渡す必要があることはわかっています。しかし。選択しただけでなく、任意のtreeviewitemをRMBクリックできる必要があります。
そしてここに質問があります:
treeviewitemのバインドされたデータを私のコマンドに渡す方法。

これがクラス診断です ここに画像の説明を入力してください

これがXamlです(編集

        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Item.Children}">
                <TextBlock Text="{Binding Item.Code}" HorizontalAlignment="Stretch">
                    <TextBlock.ContextMenu>
                        <ContextMenu Name="MyContextMenu" DataContext="{Binding PlacementTarget,RelativeSource={RelativeSource Self}}">
                            <MenuItem Header="{Binding DataContext.ToString()}" Command="{Binding DataContext.Item.AddNewItemCommand}" CommandParameter="{Binding}"/>
                        </ContextMenu>                            
                    </TextBlock.ContextMenu>
                </TextBlock>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>

しかし、それは私のコマンドを呼び出すことさえしません。

    private void AddNewItem(object toItem)
    {
        if (toItem == null)
            return;
        ItemViewModel item = toItem as ItemViewModel;
        ItemMaterialModel itemMaterial = new ItemMaterialModel(ItemModel.CreateNewItem());

        ItemMaterialViewModel itemMaterialViewModel = new ItemMaterialViewModel(itemMaterial);
        item.Children.Add(itemMaterialViewModel);
    }

たぶん私のコマンドが間違ったViewModelにありますか?

よろしく、ドミトリー。

4

3 に答える 3

2

こんにちはこれはあなたがバインドできる方法です

        <ContextMenu Name="MyContextMenu" DataContext="{Binding PlacementTarget,RelativeSource={RelativeSource Self}}">
                <MenuItem Header="Add" Command="{Binding DataContext.AddNewItemCommand}" CommandParameter="{Binding }"/>
            </ContextMenu>

これがお役に立てば幸いです。

于 2013-02-03T13:56:44.273 に答える
2

ethicallogicsとPlacementPropertyに関する彼の情報のおかげで、Xamlを次のように変更しました。

        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Item.Children}">
                <TextBlock Text="{Binding Item.Code}" HorizontalAlignment="Stretch">
                    <TextBlock.ContextMenu>
                        <ContextMenu DataContext="{Binding PlacementTarget.DataContext,RelativeSource={RelativeSource Mode=Self}}">
                            <MenuItem 
                                Header="{Binding Item.Code}"
                                Command="{Binding Item.AddNewItemCommand}" 
                                      CommandParameter="{Binding Item}"/>
                        </ContextMenu>                            
                    </TextBlock.ContextMenu>
                </TextBlock>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>

そして、私のStructureManagerViewModel中では、単純なMainItemではなく、ツリーのアイテムソースで使用されるMainItemのコレクションを作成しました。

よろしく、ドミトリー。
この経験が人々に役立つことを願っています。

于 2013-02-06T14:15:57.603 に答える
0

ここにあるコードを使用して、右クリックでアイテムを検出できます(そして、ポジティブな視覚的フィードバックのためにそれを選択します)。

@ethicallogicsが提供するソリューションでPlacementTargetが実行していることの説明については、このリンクをたどってください。

うまくいけば、2つの答えを組み合わせて問題を解決することができます。

于 2013-02-03T22:03:18.823 に答える