我见过很多关于如何执行此任务的示例(我确定已经看过),但似乎一次又一次出现的一行如下:
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。无论我选择顶级还是底级(顶级有四个项目,底层有三个),我知道了。
如果有人可以帮助我解决这个问题,那将非常感激。感谢。
答案 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...
}
}
。
然后,您应该能够访问父类属性或此类的某些内容以获取对父场景的引用。