我有一个树视图,它是从ItemsSource
SecondViewModel
个实例创建的,与我的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>
如前所述,该命令永远不会被调用。我的代码有什么问题?
答案 0 :(得分:3)
我认为您要做的是在您的孩子DoubleClick
上设置TreeViewItems
命令,而不是设置TreeViewItem
ItemsSource
现在你的XAML正在建立一个父TreeViewItem
,并在该版本下构建了TreeViewItems
中每个项目的一堆子ClassCollection
。当您双击父TreeViewItem
然后运行SelectOtherTab
命令时,无法指定单击哪个子TreeViewItem
。
这是您现在拥有的XAML的简化视图。
<TreeView x:Name="treeView">
<TreeViewItem OnDoubleClick="SelectOtherTab"> <!-- Parent TreeViewItem -->
<TreeViewItem /><!-- Child TreeViewItems -->
<TreeViewItem />
<TreeViewItem />
...
</TreeViewItem>
</TreeView>
相反,您希望将Command
和CommandParameter
属性附加到每个子TreeViewItem
,如下所示:
<TreeViewItem.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="commandBehaviors:MouseDoubleClick.Command"
Value="{Binding ElementName=treeView, Path=DataContext.SelectOtherTab}" />
<Setter Property="commandBehaviors:MouseDoubleClick.CommandParameter"
Value="{Binding }" />
</Style>
</TreeViewItem.ItemContainerStyle>
这将使您的简化XAML看起来像这样:
<TreeView x:Name="treeView">
<TreeViewItem> <!-- Parent TreeViewItem -->
<TreeViewItem OnDoubleClick="SelectOtherTab" /><!-- Child TreeViewItems -->
<TreeViewItem OnDoubleClick="SelectOtherTab"/>
<TreeViewItem OnDoubleClick="SelectOtherTab" />
...
</TreeViewItem>
</TreeView>
我仍然对为什么你有一个父TreeViewItem
并使用TreeViewItems
建立孩子ItemsSource
感到困惑,但如果没有必要,你可以通过消除来简化你的VisualTree这样的父TreeViewItem
:
<TreeView Name="treeView"
ItemsSource="{Binding ClassCollection}"
ItemContainerStyle="{StaticResource TreeViewItemStyle}"
Grid.Row="1" Grid.Column="1">
<TreeView.Resources>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="Header" Value="ProjectName" />
<Setter Property="ContextMenu" Value="{StaticResource AddClassMenu}" />
<Setter Property="ItemTemplate" Value="{DynamicResource ClassDataTemplate}" />
<Setter Property="commandBehaviors:MouseDoubleClick.Command"
Value="{Binding ElementName=treeView, Path=DataContext.SelectOtherTab}" />
<Setter Property="commandBehaviors:MouseDoubleClick.CommandParameter"
Value="{Binding }" />
</Style>
</TreeView.Resources>
</TreeView>
这将使您的TreeView看起来像这样:
<TreeView x:Name="treeView">
<TreeViewItem OnDoubleClick="SelectOtherTab" />
<TreeViewItem OnDoubleClick="SelectOtherTab"/>
<TreeViewItem OnDoubleClick="SelectOtherTab" />
...
</TreeView>
答案 1 :(得分:0)
你必须在MyViewModel中声明一个SecondViewModel类型的属性。然后你也可以将数据绑定到内部项目。
CommandParameter =“{Binding SecondViewModelProp.CommandParam}”
如果在SecondViewModelProp中定义了命令参数。
如果我理解错误,请告诉我。
public class MyViewModel
{
public SecondViewModel SecondViewModelProp
{
get { return new SecondViewModel(); }
}
public MyViewModel()
{
}
}