Wpf TreeViewItem 上下文菜单命令绑定不起作用
Wpf TreeViewItem Contextmenu Command binding not working
我想为 TreeViewItem
创建一个 ContextMenu
并将参数作为 TreeViewItem
数据上下文(而不是 TreeView
数据上下文)传递。
我收到以下命令绑定错误。问题是什么?
我还尝试了 TreeViewItem
、MenuItem
和 ContextMenu
作为 AncestorType
。
我也试过 AncestorLevel
为 1
、2
、3
,但并没有改变结果。
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.TreeView', AncestorLevel='1''. BindingExpression:Path=DataContext.DeleteFolderCommand; DataItem=null; target element is 'MenuItem' (Name=''); target property is 'Command' (type 'ICommand')
这是我的代码:
<TreeView ItemsSource="{Binding Folders}">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}"
BasedOn="{StaticResource {x:Type TreeViewItem}}">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="Sil"
Command="{Binding DataContext.DeleteFolderCommand,RelativeSource={RelativeSource AncestorType={x:Type TreeView},Mode=FindAncestor}}"
CommandParameter="{Binding }"></MenuItem>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
ContextMenu
与其关联控件不属于同一可视化树,因此 RelativeSource
绑定不起作用。
改为将 TreeViewItem
的 Tag
属性 绑定到父 TreeView
的 DataContext
。然后就可以通过上下文菜单中的PlacementTarget
属性访问这个属性,设置为对应的TreeViewItem
.
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}"
BasedOn="{StaticResource {x:Type TreeViewItem}}">
<Setter Property="Tag" Value="{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type TreeView}}}"/>
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="Sil"
Command="{Binding PlacementTarget.Tag.DeleteFolderCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
CommandParameter="{Binding}"></MenuItem>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</TreeView.ItemContainerStyle>
我想为 TreeViewItem
创建一个 ContextMenu
并将参数作为 TreeViewItem
数据上下文(而不是 TreeView
数据上下文)传递。
我收到以下命令绑定错误。问题是什么?
我还尝试了 TreeViewItem
、MenuItem
和 ContextMenu
作为 AncestorType
。
我也试过 AncestorLevel
为 1
、2
、3
,但并没有改变结果。
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.TreeView', AncestorLevel='1''. BindingExpression:Path=DataContext.DeleteFolderCommand; DataItem=null; target element is 'MenuItem' (Name=''); target property is 'Command' (type 'ICommand')
这是我的代码:
<TreeView ItemsSource="{Binding Folders}">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}"
BasedOn="{StaticResource {x:Type TreeViewItem}}">
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="Sil"
Command="{Binding DataContext.DeleteFolderCommand,RelativeSource={RelativeSource AncestorType={x:Type TreeView},Mode=FindAncestor}}"
CommandParameter="{Binding }"></MenuItem>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
ContextMenu
与其关联控件不属于同一可视化树,因此 RelativeSource
绑定不起作用。
改为将 TreeViewItem
的 Tag
属性 绑定到父 TreeView
的 DataContext
。然后就可以通过上下文菜单中的PlacementTarget
属性访问这个属性,设置为对应的TreeViewItem
.
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}"
BasedOn="{StaticResource {x:Type TreeViewItem}}">
<Setter Property="Tag" Value="{Binding DataContext, RelativeSource={RelativeSource AncestorType={x:Type TreeView}}}"/>
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="Sil"
Command="{Binding PlacementTarget.Tag.DeleteFolderCommand, RelativeSource={RelativeSource AncestorType=ContextMenu}}"
CommandParameter="{Binding}"></MenuItem>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</TreeView.ItemContainerStyle>