WPF Treeview如何选择父节点

时间:2017-03-22 21:15:18

标签: c# wpf xaml mvvm treeview

我见过很多关于如何执行此任务的示例(我确定已经看过),但似乎一次又一次出现的一行如下:

TreeViewItem item = e.OriginalSource as TreeViewItem;

哪个有道理。问题是,无论我在树视图中点击什么,item始终为null。

我的树视图有两层。顶层是场景,底层是字符。每个场景包含一个或多个字符。我的目的是能够在选择角色时知道场景。

我想也许我的TreeView可能会以很多人的方式完成,所以我也会提供:

<TreeView x:Name="ScenesTreeView01" Grid.Column="0" Width="Auto" Background="AliceBlue" ItemsSource="{Binding Scenes}" SelectedItemChanged="TreeView_SelectedItemChanged" BorderThickness="0">
        <TreeView.DataContext>
            <viewModels:ScenesViewModel />
        </TreeView.DataContext>
        <TreeView.Resources>
            <ContextMenu x:Key="SceneLevel">
                            <MenuItem Header="Add selected character" Command="{Binding Path=DataContext.AddSelectedCharacter, Source={x:Reference ScenesTreeView01}}"/>
            </ContextMenu>
            <ContextMenu x:Key="CharacterLevel">
                            <MenuItem Header="Remove character from scene" Command="{Binding Path=DataContext.RemoveCharacterFromScene, Source={x:Reference ScenesTreeView01}}"/>
            </ContextMenu>
        </TreeView.Resources>
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding Characters}">
                    <StackPanel Orientation="Horizontal" ContextMenu="{StaticResource SceneLevel}">
                    <TextBlock Text="{Binding SceneName}"></TextBlock>

                        <Image Source="{StaticResource ImgBook1}" Margin="0,0,5,0" Width="32" Height="32"/>

                </StackPanel>
                <HierarchicalDataTemplate.ItemTemplate>
                    <DataTemplate>
                        <Border BorderThickness="2" BorderBrush="LightBlue" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="2" CornerRadius="5,5,5,5">
                            <StackPanel Orientation="Horizontal" Margin="3" ContextMenu="{StaticResource CharacterLevel}">

                            <TextBlock FontFamily="Levenim MT" FontSize="16" VerticalAlignment="Center" MinWidth="50" Text="{Binding FirstName}"></TextBlock>

                                <Image Source="{Binding ImgIcon}" Margin="2" Width="32" Height="32"/>

                        </StackPanel>
                        </Border>
                    </DataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

e.OriginalSource确实提供了一些东西,就是这样:System.Windows.Controls.TreeView Items.Count:4。无论我选择顶级还是底级(顶级有四个项目,底层有三个),我知道了。

如果有人可以帮助我解决这个问题,那将非常感激。感谢。

2 个答案:

答案 0 :(得分:0)

如果你有约束力,你将不再获得$scope.$apply(function() { $scope.imageDataUrl = imageDataUrl; }); ,而是从viewmodel / datacontext收集项目。

就父母而言,我建议将其定义为上述viewmodel类的属性。

我在github

上有一个带有树状视图的项目/示例

答案 1 :(得分:0)

您可以尝试将NewValue的{​​{1}}属性转换为RoutedPropertyChangedEventArgs<object>类型:

Character

此属性应包含新选择的项目,如果转换成功,则表示已选择private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) { Character c = e.NewValue as Character; if (c != null) { //a character was selected... } }

然后,您应该能够访问父类属性或此类的某些内容以获取对父场景的引用。