Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF MVVM TreeView项源在命令后丢失上下文_C#_Wpf_Mvvm - Fatal编程技术网

C# WPF MVVM TreeView项源在命令后丢失上下文

C# WPF MVVM TreeView项源在命令后丢失上下文,c#,wpf,mvvm,C#,Wpf,Mvvm,我有一个包含文件的树视图,每个视图模型都有一个项目源,它是一个包含文件和项目的可观察集合: public ObservableCollection<CMItemFileNode> SubItemNode 公共ObservableCollection子项节点 在每个项目上,我都有上下文菜单选项(删除、执行..)。 如果我从一个视图模型移动到另一个视图模型,文件的ObservableCollection将正确更新和显示,但当我执行上下文菜单命令(如delete file item)时

我有一个包含文件的树视图,每个视图模型都有一个项目源,它是一个包含文件和项目的可观察集合:

public ObservableCollection<CMItemFileNode> SubItemNode
公共ObservableCollection子项节点
在每个项目上,我都有上下文菜单选项(删除、执行..)。 如果我从一个视图模型移动到另一个视图模型,文件的ObservableCollection将正确更新和显示,但当我执行上下文菜单命令(如delete file item)时,该命令执行良好,但当我移动到另一个视图模型时(该视图模型保存的子项节点ObservableCollection是自己的)在执行命令之后,WPF仍然认为我在我所在的最后一个视图模型中,而不是我真正使用的视图模型中

非常重要的一点是,当我更新到.NET4.5(不幸的是我无法做到)时,一切都正常,ObservableCollection处理了正确的视图模型

这是树景:

<TreeView x:Name="Files" Margin="0,5,5,0" Grid.Row="6" Grid.Column="2" ItemsSource="{Binding SubItemNode}"  HorizontalAlignment="Stretch" HorizontalContentAlignment="Stretch" VerticalAlignment="Stretch" Height="300" Grid.RowSpan="6" Width="300"                                                                        dd:DragDrop.IsDragSource="True" dd:DragDrop.IsDropTarget="True" dd:DragDrop.DropHandler="{Binding}" dd:DragDrop.UseDefaultDragAdorner="True">
<TreeView.Resources>
    <Style TargetType="{x:Type TreeView}">
        <Setter Property="local:CMTreeViewFilesBehavior.IsTreeViewFilesBehavior" Value="True"/>
    </Style>
    <Style TargetType="{x:Type TreeViewItem}">
        <Setter Property="IsSelected" Value="{Binding IsSelected}" />
        <Setter Property="local:CMTreeViewFilesItemBehavior.IsTreeViewFilesItemBehavior" Value="True"/>                              
    </Style>
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" />
    <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" />
</TreeView.Resources>
    <TreeView.ContextMenu>
        <ContextMenu>
            <MenuItem Header="View File" Command="{Binding ExecuteFileCommand}" />

            <Separator />

            <MenuItem Header="Delete all" Command="{Binding DeleteAllFilesCommand}" />
            <MenuItem Header="Delete selected" Command="{Binding DeleteSelectedFilesCommand}" />
        </ContextMenu>
    </TreeView.ContextMenu>
    <TreeView.ItemTemplate>
      <HierarchicalDataTemplate ItemsSource="{Binding SubItemNode}" >
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>                             
                <Image Grid.Column="0" Margin="2" Width="32" Height="18" Source="{Binding Path=Icon}" HorizontalAlignment="Left" VerticalAlignment="Center" />
            <TextBlock Text="{Binding Path=Name}" Grid.Column="1" Margin="2"  VerticalAlignment="Center" Foreground="{Binding Path=Status, Converter={StaticResource ItemFileStatusToColor}}" FontWeight="{Binding Path=IsSelected, Converter={StaticResource BoolToFontWidth}}"/>
            </Grid>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>


我做错什么了吗?为什么在.net 4.5中它工作得很好?

显然在.net 4中,执行上下文菜单命令后,我们会丢失树中的上下文。 要解决此问题,我们需要将其添加到上下文菜单中:

   <ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}" >

如果我们升级到.NET4.5,就没有必要了