簡體   English   中英

在CommandParameter中傳遞項DataContext

[英]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命令,而不是設置ItemsSourceTreeViewItem

現在你的XAML正在建立一個父TreeViewItem ,並在該構建下為ClassCollection每個項構建一堆子TreeViewItems 雙擊父TreeViewItem然后運行SelectOtherTab命令,但是沒有任何內容可以指定單擊哪個子TreeViewItem

這是您現在擁有的XAML的簡化視圖。

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

相反,您希望將CommandCommandParameter屬性附加到每個子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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM