在CommandParameter中传递DataContext项
本文关键字:DataContext CommandParameter | 更新日期: 2023-09-27 17:49:57
我有一个从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>
如前所述,该命令永远不会被调用。我的代码有什么问题?
我认为你要做的是在你的孩子TreeViewItems
上设置你的DoubleClick
命令,而不是你的父母TreeViewItem
设置ItemsSource
现在你的XAML说要建立一个父TreeViewItem
,并在ClassCollection
中为每个项目建立一堆子TreeViewItems
。当你双击父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
和正在使用它的ItemsSource
构建子TreeViewItems
,但是,如果这不是必要的,你可以简化你的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>
你必须在MyViewModel中声明一个类型为SecondViewModel的属性。然后你也可以将数据绑定到内部项。
CommandParameter ="{Binding SecondViewModelProp。CommandParam} "
if命令参数是在SecondViewModelProp中定义的。
如果我理解错了,请告诉我。
public class MyViewModel
{
public SecondViewModel SecondViewModelProp
{
get { return new SecondViewModel(); }
}
public MyViewModel()
{
}
}