私は持っTreeView
ていHierarchicalDataTemplate
ます。私TreeView
が持っているContextMenu
<TreeView Name="_packageTreeView" ItemsSource="{Binding PackageExtendedList}" Behaviors:TreeViewInPlaceEditBehavior.IsEditable="True">
<TreeView.ContextMenu>
<ContextMenu StaysOpen="true">
<MenuItem Header="Добавить пакет" Height="20" Command="{Binding AddPackageCommand}"
CommandParameter="{Binding ElementName=_packageTreeView, Path=SelectedItem}">
<MenuItem.Icon>
<Image Source="/Resources/ManualAdd.png" Width="15" Height="15"></Image>
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
</TreeView.ContextMenu>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Childs}">bla bla bla</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
ご覧のとおり、Command
メニュー項目にバインドします。AddPackageCommand は通常どおり ViewModel クラスで定義されます。Invoke コマンドは正常に動作しますが、null
常にCommandParameter
. 似たような質問をいくつか見つけましたが、解決策がわかりません。例えば:
WPF の ContextMenu の CommandParameters
とにかく、私にはうまくいきません:(何が間違っているのですか?
更新しました
それは機能しているようですが、それはすべて同じです。なぜ が機能しないのかわかりCommandParameter
ませんTreeView.Name
。
CommandParameter="{Binding PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"
たとえば、そのようなサンプルは正常に動作します
<i:EventTrigger EventName="SelectedItemChanged">
<i:InvokeCommandAction Command="{Binding PackageTreeItemChangeCommand}" CommandParameter="{Binding ElementName=_packageTreeView, Path=SelectedItem}"/>
</i:EventTrigger>
ちくしょうマジかよ...
とにかく、私はではなくにTreeView
オブジェクトを持っています。から取得できますが、正確に を送信するにはどうすればよいですか?CommandParameter
TreeViewItem
SelectedItem
TreeView
TreeViewItem
CommandParameter
シェリダンへ
質問は、なぜこれが機能しないのかということでした。
CommandParameter="{Binding ElementName=_packageTreeView, Path=SelectedItem}"
そして、これは機能します
CommandParameter="{Binding PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"
TreeView コントロール名を直接使用できる場合と使用できない場合があるのはなぜですか。TreeView
私が理解しているように、問題はコントロールの DataContext とは異なり、独自の VisualTree があり、の一部ではないためContextMenu
です。ContextMenu
TreeView
ViaualTree
残念ながら、そのアプローチもうまくいきませんnull
。確かに TreeView.Tag を設定しました。
<ContextMenu DataContext="{Binding PlacementTarget.Tag, RelativeSource={
RelativeSource Self}}" StaysOpen="true">
<MenuItem Header="Добавить пакет" Height="20" Command="{Binding AddPackageCommand}"
CommandParameter="{Binding ElementName=_packageTreeView, Path=SelectedItem}">
<MenuItem.Icon>
<Image Source="/Resources/ManualAdd.png" Width="15" Height="15"></Image>
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
これが最も簡単な方法ですが、ViewModel に SelectedItem プロパティがある場合、CommandParameter
既に ViewModel にあるため、それを にバインドしても意味がありません。
<MenuItem Header="Добавить пакет" Height="20" Command="{Binding AddPackageCommand}"
CommandParameter="{Binding SelectedItem}">
<MenuItem.Icon>
<Image Source="/Resources/ManualAdd.png" Width="15" Height="15"></Image>
</MenuItem.Icon>
</MenuItem>