gpt4 book ai didi

c# - WPF MVVM TreeView 项目源在命令后丢失上下文

转载 作者:太空宇宙 更新时间:2023-11-03 15:52:07 30 4
gpt4 key购买 nike

我有一个包含文件的 TreeView ,每个 View 模型都有一个项目源,它是一个带有文件项目的 ObservableCollection:

public ObservableCollection<CMItemFileNode> SubItemNode

在每个项目上我都有上下文菜单选项(删除、执行..)。如果我从一个 View 模型移动到另一个 View 模型,文件的 ObservableCollection 会正确更新并正确呈现,但是,当我执行上下文菜单命令(如删除文件项)时,命令执行良好但是当我移动到另一个 View 模型(其中包含 SubItemNode ObservableCollection 是own) 在命令执行后,WPF 仍然认为我在我所在的最后一个 View 模型中,而不是我真正所在的 View 模型中。

值得一提的是,当我更新到 .net 4.5 时(不幸的是我不能这样做)一切正常并且 ObservableCollection 解决了正确的 View 模型。

这是 TreeView :

<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}}" >

如果我们升级到 .net 4.5,则没有必要。

关于c# - WPF MVVM TreeView 项目源在命令后丢失上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25380849/

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