设置在windows . resources中声明为静态资源的菜单项的DataContext
本文关键字:资源 静态 菜单项 DataContext 声明 windows resources 设置 | 更新日期: 2023-09-27 18:17:54
我有这个上下文菜单,我在我的TreeView的不同datatemplate中使用。
<Window.Resources>
<ContextMenu x:Key="mnuContextTreeView">
<ContextMenu.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{StaticResource mnuRun}" />
<Separator />
<CollectionContainer Collection="{StaticResource mnuResults}" />
<Separator />
<MenuItem Name="mnuFlagContext" Command="local:MainWindow.MarkFlagged"
DataContext="" Visibility="{Binding Path=Flagged, Mode=OneWay,
Converter={StaticResource boolToCollapsedVisibilityConverter}}" />
<!-- I would like to set the DataContext of this one, so it could
be hidden based on a property of the underlying ItemGroup or
ItemType in the TreeView -->
<CollectionContainer Collection="{StaticResource mnuStandardEdit}" />
</CompositeCollection>
</ContextMenu.ItemsSource>
</ContextMenu>
</Window.Resources>
使用上述上下文菜单的TreeView:
<TreeView Name="myTreeView" DataContext="{Binding ElementName=mainWindow,
Path=RootElement}" ItemsSource="{Binding}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type logic:ItemGroup}"
ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}" Foreground="Blue"
ContextMenu="{Binding Source={StaticResource mnuContextTreeView}}" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type logic:ItemType}">
<TextBlock Text="{Binding Name}" Foreground="Red"
ContextMenu="{Binding Source={StaticResource mnuContextTreeView}}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
我怎么能设置一个名为mnuFlagContext的菜单项的数据上下文,这样它就可以隐藏基于底层ItemGroup或ItemType在TreeView的属性?
如果要求获得Flagged
属性可以从TreeViewItem
的DataContext
到ContextMenu
的MenuItem.Header
你可以试试:
<ContextMenu x:Key="mnuContextTreeView"
DataContext="{Binding RelativeSource={RelativeSource Self},
Path=PlacementTarget.DataContext}">
<ContextMenu.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{StaticResource mnuRun}" />
<Separator />
<CollectionContainer Collection="{StaticResource mnuResults}" />
<Separator />
<MenuItem Header="{Binding Path=Flagged,
Mode=OneWay,
Converter={StaticResource flaggedToHeaderConverter}}"
Command="local:MainWindow.MarkFlagged" />
<CollectionContainer Collection="{StaticResource mnuStandardEdit}" />
</CompositeCollection>
</ContextMenu.ItemsSource>
</ContextMenu>
,没有改变原来的TreeView
部分
<TreeView Name="myTreeView" DataContext="{Binding ElementName=mainWindow,
Path=RootElement}" ItemsSource="{Binding}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type logic:ItemGroup}"
ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}" Foreground="Blue"
ContextMenu="{Binding Source={StaticResource mnuContextTreeView}}" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type logic:ItemType}">
<TextBlock Text="{Binding Name}" Foreground="Red"
ContextMenu="{Binding Source={StaticResource mnuContextTreeView}}" />
</HierarchicalDataTemplate>
</TreeView.Resources>
</TreeView>
设法用以下方法解决它(最终头被绑定而不是可见性,但与解决方案无关):
1)将菜单分隔为单独的静态资源:
<collections:ArrayList x:Key="mnuToggleFlag" x:Shared="False">
<MenuItem Command="local:MainWindow.ToggleFlag"
Header="{Binding Path=Flagged, Mode=OneWay,
Converter={StaticResource flaggedToHeaderConverter}}" />
</collections:ArrayList>
2)从ContextMenu中引用它:
<ContextMenu x:Key="mnuContextTreeView">
<ContextMenu.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{StaticResource mnuRun}" />
<Separator />
<CollectionContainer Collection="{StaticResource mnuResults}" />
<Separator />
<!-- Below is the reference for the new static resource -->
<CollectionContainer Collection="{StaticResource mnuToggleFlag}" />
<CollectionContainer Collection="{StaticResource mnuStandardEdit}" />
</CompositeCollection>
</ContextMenu.ItemsSource>
</ContextMenu>
3)从后面的代码设置DataContext:
((MenuItem)((ArrayList)Resources["mnuToggleFlag"])[0]).DataContext = _actualItem;