【发布时间】:2012-02-09 18:40:16
【问题描述】:
我有一个用户控件,里面有一棵树,命令属性绑定到 DataType 而不是 DataContext。
如何将绑定重定向到 DataContext 而不是 DataType ?另外出于好奇,我将如何绑定到 UserControl 的 DataContext 而不是 Tree 的 DataContext ?
这里是有问题的代码:
<HierarchicalDataTemplate
DataType="{x:Type viewModel:UsersViewModel}"
ItemsSource="{Binding Children}"
>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding UserName}">
<TextBlock.ContextMenu>
<ContextMenu>
<MenuItem Header="Edit" Command="{Binding EditCommand}" CommandParameter="{Binding UserName}"/>
<MenuItem Header="Delete"/>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</StackPanel>
</HierarchicalDataTemplate>
它似乎绑定到 UsersViewModel 而不是 DataContext(AllUsersViewModel)。
这是整个 XAML 以防万一:
<Grid Width="150">
<TreeView ItemsSource="{Binding Users}" DataContext="{Binding allUsersViewModel}">
<TreeView.ItemContainerStyle>
<!--
This Style binds a TreeViewItem to a TreeViewItemViewModel.
-->
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
<Setter Property="FontWeight" Value="Normal" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="FontWeight" Value="Bold" />
</Trigger>
</Style.Triggers>
</Style>
</TreeView.ItemContainerStyle>
<TreeView.Resources>
<ContextMenu x:Key="CategoryMenu">
<MenuItem Header="Add Subcategory" Command="New">
</MenuItem>
<MenuItem Header="Remove Category" Command="Delete">
</MenuItem>
</ContextMenu>
<HierarchicalDataTemplate
DataType="{x:Type viewModel:UsersViewModel}"
ItemsSource="{Binding Children}"
>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding UserName}">
<TextBlock.ContextMenu>
<ContextMenu>
<MenuItem Header="Edit" Command="{Binding EditCommand}" CommandParameter="{Binding UserName}"/>
<MenuItem Header="Delete"/>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</StackPanel>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate
DataType="{x:Type viewModel:PermissionCategoryViewModel}"
ItemsSource="{Binding Children}"
>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding PermissionCategoryName}" />
</StackPanel>
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type viewModel:PermissionViewModel}">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding PermissionName}" />
</StackPanel>
</DataTemplate>
</TreeView.Resources>
</TreeView>
</Grid>
感谢您的帮助!
编辑
好吧,我尝试了一些方法,但没有成功 =(。什么都没有发生
我应该提到我的 MainWindow 具有 DataContext 并且 UserControl 通过将 UserControl 放置在其中来继承它。
<Window.DataContext>
<viewModel:MainViewModel/>
</Window.DataContext>
我尝试了这些不同的东西
Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:AllUsers}}, Path=DataContext.EditCommand}"
和
Command="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:MainWindow}}, Path=DataContext.EditCommand}"
和
Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainWindow}}, Path=DataContext.EditCommand}"
和
Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:AllUsers}}, Path=DataContext.EditCommand}"
最后
Command="{Binding PlacementTarget.DataContext.EditCommand,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ContextMenu}}}"
【问题讨论】:
标签: wpf xaml data-binding