![](/img/trans.png)
[英]Bind CommandParameter to local item while DataContext is ViewModel
[英]Pass the item DataContext in CommandParameter
我有一個TreeView,它是從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
命令,而不是設置ItemsSource
父TreeViewItem
現在你的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
,但是如果沒有必要你可以通過消除這樣的父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>
你必須在MyViewModel中聲明一個SecondViewModel類型的屬性。然后你也可以將數據綁定到內部項目。
CommandParameter =“{Binding SecondViewModelProp.CommandParam}”
if命令參數是在SecondViewModelProp中定義的。
如果我理解錯誤,請告訴我。
public class MyViewModel
{
public SecondViewModel SecondViewModelProp
{
get { return new SecondViewModel(); }
}
public MyViewModel()
{
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.