无法在元素 ResourceDictionary 中绑定 DataContext
Can't bind DataContext in element ResourceDictionary
在我的 UserConterl 中。
<UserControl.Resources >
<ResourceDictionary >
<ContextMenu x:Key="MyContextMenu " >
<MenuItem Header="{Binding Header}">
</ContextMenu >
<HierarchicalDataTemplate x:Key="MyTemplate">
<TextBlock x:Key="MyTextBlock" Text = {Binding Header} ContextMenu="{StaticResource MyContextMenu }"/>
</HierarchicalDataTemplate >
</ResourceDictionary >
</UserControl.Resources>
<TreeView ItemTemplate="{StaticResource MyTemplate}" ItemsSource="{Binding MySources}" >
以上 xaml.There 代码中的代码在 UserControl xaml.cs 中。
public MyUserControl()
{
InitializeComponent();
this.DataContext = new MyViewModel();
}
public class MyViewModel: ViewModelBase
{
public string Header {get; set;}
public List<string> MySources \ Has been assigned
}
预期的结果是当我点击rightbutton.Actually时显示字段Header,弹出菜单empty.I发现ContextMenu没有绑定DataContext。我应该怎么办?
谢谢!
减去设置你的数据上下文,如果你试图将上下文菜单项绑定到父控件的数据上下文,你必须使用 PlacementTarget.Tag 技巧。这是因为上下文菜单位于不同的可视化树上。
您也不需要 <TextBlock Text="{Binding Header}"
中的页眉,将其保留为 <TextBlock Text="{Binding}"
<Grid Background="DarkGray">
<Grid.Resources>
<ContextMenu x:Key="CM">
<MenuItem Header="{Binding PlacementTarget.Tag.Header,
RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}"/>
</ContextMenu>
<HierarchicalDataTemplate x:Key="MyTemplate">
<TextBlock Text="{Binding}"
ContextMenu="{StaticResource CM }"
Tag="{Binding DataContext,RelativeSource={RelativeSource AncestorType=TreeView, Mode=FindAncestor}}"/>
</HierarchicalDataTemplate >
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<TreeView Grid.Row="0"
ItemTemplate="{StaticResource MyTemplate}"
ItemsSource="{Binding Sources}"></TreeView>
</Grid>
在我的 UserConterl 中。
<UserControl.Resources >
<ResourceDictionary >
<ContextMenu x:Key="MyContextMenu " >
<MenuItem Header="{Binding Header}">
</ContextMenu >
<HierarchicalDataTemplate x:Key="MyTemplate">
<TextBlock x:Key="MyTextBlock" Text = {Binding Header} ContextMenu="{StaticResource MyContextMenu }"/>
</HierarchicalDataTemplate >
</ResourceDictionary >
</UserControl.Resources>
<TreeView ItemTemplate="{StaticResource MyTemplate}" ItemsSource="{Binding MySources}" >
以上 xaml.There 代码中的代码在 UserControl xaml.cs 中。
public MyUserControl()
{
InitializeComponent();
this.DataContext = new MyViewModel();
}
public class MyViewModel: ViewModelBase
{
public string Header {get; set;}
public List<string> MySources \ Has been assigned
}
预期的结果是当我点击rightbutton.Actually时显示字段Header,弹出菜单empty.I发现ContextMenu没有绑定DataContext。我应该怎么办? 谢谢!
减去设置你的数据上下文,如果你试图将上下文菜单项绑定到父控件的数据上下文,你必须使用 PlacementTarget.Tag 技巧。这是因为上下文菜单位于不同的可视化树上。
您也不需要 <TextBlock Text="{Binding Header}"
中的页眉,将其保留为 <TextBlock Text="{Binding}"
<Grid Background="DarkGray">
<Grid.Resources>
<ContextMenu x:Key="CM">
<MenuItem Header="{Binding PlacementTarget.Tag.Header,
RelativeSource={RelativeSource AncestorType=ContextMenu, Mode=FindAncestor}}"/>
</ContextMenu>
<HierarchicalDataTemplate x:Key="MyTemplate">
<TextBlock Text="{Binding}"
ContextMenu="{StaticResource CM }"
Tag="{Binding DataContext,RelativeSource={RelativeSource AncestorType=TreeView, Mode=FindAncestor}}"/>
</HierarchicalDataTemplate >
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<TreeView Grid.Row="0"
ItemTemplate="{StaticResource MyTemplate}"
ItemsSource="{Binding Sources}"></TreeView>
</Grid>