【发布时间】:2012-12-14 02:17:47
【问题描述】:
我有一个树视图,它是从 SecondViewModel 实例中的 ItemsSource 创建的,与我的 Window DataContext 不同。
我想通过 `CommandParameter 发送属于 TreeViewItem 的 ViewModel。
窗口数据上下文是:MyViewModel。
treeviewitems 数据上下文为:SecondViewModel
我想传递 SecondViewModel 而不是 MyViewModel。
因此,
CommandParameter ="{Binding}"
不起作用(因为它会发送MyViewModel)
编辑:一些代码:
<TreeView Name="treeView" ItemContainerStyle="{StaticResource TreeViewItemStyle}" Grid.Row="1" Grid.Column="1">
<TreeViewItem Header="{Binding ProjectName}">
<TreeViewItem commandBehaviors:MouseDoubleClick.Command="{Binding SelectOtherTab}"
commandBehaviors:MouseDoubleClick.CommandParameter="{Binding}" //this returns the data context of the window, I want to return the Item Source
ContextMenu="{StaticResource AddClassMenu}" ItemTemplate="{DynamicResource ClassDataTemplate}" ItemsSource="{Binding ClassCollection}">
如何发送SecondViewModel?
编辑:
我想启用删除当前项目,但由于某种原因该命令永远不会被调用。
代码如下:
<TreeViewItem x:Name="treeViewItem"
ContextMenu="{StaticResource AddClassMenu}" ItemTemplate="{DynamicResource ClassDataTemplate}" ItemsSource="{Binding ClassCollection}">
<TreeViewItem.ItemContainerStyle>
<Style TargetType="TreeViewItem">
HERE->> <Setter Property="ContextMenu" Value="{StaticResource RemoveClassMenu}"/>
<Setter Property="commandBehaviors:MouseDoubleClick.Command"
Value="{Binding ElementName=treeViewItem, Path=DataContext.SelectOtherTab}" />
<Setter Property="commandBehaviors:MouseDoubleClick.CommandParameter"
Value="{Binding }" />
</Style>
</TreeViewItem>
我的上下文菜单:
<ContextMenu x:Key="RemoveClassMenu">
<MenuItem Header="Delete" Command="{Binding ElementName=treeViewItem, Path=DataContext.RemoveClass}" CommandParameter="{Binding}"/>
</ContextMenu>
如前所述,该命令永远不会被调用。我的代码有什么问题?
【问题讨论】:
-
请问为什么要在CommandParameter中绑定整个ItemSource?以及如何设置 TreeView 的 ItemSource。
-
我对您的
SecondViewModel与您的MyViewModel的关系以及ItemsSource的来源有点困惑。您能否包含更多代码来显示这 3 个如何相互关联?如果您使用ItemsSource属性而不是手动定义每个TreeViewItem来构建TreeView,那么您可以在ItemContainerStyle中设置您的命令行为,{Binding }将引用ItemsSource中的每个项目。现在,我根本看不到您的SecondViewModel在您的代码中的位置。 -
@MatsMagnem 我不想要整个 ItemSource,只想要与 treeviewitem 相关的那个。 (1 项)
-
@Rachel 对不起,我说'SecondViewModel'只是为了更容易理解,它实际上是ItemSource - ClassCollection,ClassCollection是从ClassViewModel创建的observablecollection(这实际上是SecondViewModel 我之前用作示例)。
-
@idish 你不能使用
{Binding ClassCollection}而不是{Binding }来传递你的SecondViewModel 吗?