gpt4 book ai didi

c# - 在 CommandParameter 中传递项目 DataContext

转载 作者:行者123 更新时间:2023-12-04 05:17:31 26 4
gpt4 key购买 nike

我有一个从 ItemsSource 创建的树 View 的 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>

如前所述,该命令永远不会被调用。我的代码有什么问题?

最佳答案

我认为您要做的是设置您的 DoubleClick对您 child 的命令 TreeViewItems ,不是你的 parent TreeViewItem其中设置了 ItemsSource
现在您的 XAML 说要构建一个父级 TreeViewItem ,然后在那建一堆 child TreeViewItems对于 ClassCollection 中的每个项目.当您双击父项时 TreeViewItem然后运行 ​​SelectOtherTab命令,但是没有什么可以指定哪个 child TreeViewItem被点击了。

这是您现在拥有的 XAML 的简化 View 。

<TreeView x:Name="treeView">
<TreeViewItem OnDoubleClick="SelectOtherTab"> <!-- Parent TreeViewItem -->
<TreeViewItem /><!-- Child TreeViewItems -->
<TreeViewItem />
<TreeViewItem />
...
</TreeViewItem>
</TreeView>

相反,您想附加 CommandCommandParameter每个 child 的属性 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>

我仍然对你为什么有 parent 感到有些困惑 TreeViewItem并且正在 build child TreeViewItems使用它的 ItemsSource ,但是如果没有必要,您可以通过消除父项 TreeViewItem 来简化您的 VisualTree像这样:
<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>

关于c# - 在 CommandParameter 中传递项目 DataContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14075894/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com