我有TreeView
和HierarchicalDataTemplate
。在TreeView
我ContextMenu
WPF 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
菜單項目。通常在ViewModell類中定義的AddPackageCommand。 Invoke命令可以正常工作,但我總是在CommandParameter
中有null
。我發現了一些類似於我的問題,但我不明白解決方案。例如:?
CommandParameters in ContextMenu in WPF
反正它不爲我工作:(我在做什麼錯
更新
這似乎是工作,但它是完全一樣的,我不明白爲什麼CommandParameter
不TreeView.Name
工作。
CommandParameter="{Binding PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"
爲examplle,這樣的樣本工作正常
<i:EventTrigger EventName="SelectedItemChanged">
<i:InvokeCommandAction Command="{Binding PackageTreeItemChangeCommand}" CommandParameter="{Binding ElementName=_packageTreeView, Path=SelectedItem}"/>
</i:EventTrigger>
什麼是地獄......
反正我有TreeView
對象CommandParameter
,不TreeViewItem
。我可以從TreeView
得到SelectedItem
,但是我怎樣才能發送TreeViewItem
作爲CommandParameter
?
到謝里登
問題是爲什麼這不起作用。
CommandParameter="{Binding ElementName=_packageTreeView, Path=SelectedItem}"
而且這個工程
CommandParameter="{Binding PlacementTarget, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"
爲什麼有時我可以直接使用TreeView控件的名字,有時我不能。 據我所知,物質是不同的DataContext的TreeView
控制和ContextMenu
,因爲ContextMenu
有它自己的VisualTree,它不是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>
這是最簡單的方法,但如果我有SelectedItem屬性在視圖模型它沒有道理將其綁定到CommandParameter
,因爲我已經擁有它的視圖模型。
<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>
這東西是如此不必要的複雜 – hinst