事件的发件人是treeviewitem中的对象。但是,它不是一个依赖对象,所以我不认为我可以使用ItemFromContainer来获取实际的TreeViewItem。我该怎么做才能获得所选的实际treeviewitem?
我发现每个人都像我的问题一样困惑于我的问题。
根据链接网站,我可以从selecteditem属性获取我的treeviewitem。但是,当我尝试这样做时,我得到null,因为发送者是SignalViewModel对象而不是TreeViewItem。
TreeViewItem treeViewItem = this.AvailableSignalsTreeView.SelectedItem as TreeViewItem;
这为我返回null,但调试器显示所选项目的类型为SignalViewModel。
我所要做的就是获得树视图的多选功能,我将使用我看到的只是切换treeviewitems的示例来做。
<TreeView
Grid.Row="0"
Background="Blue"
Foreground="Orange"
x:Name="AvailableSignalsTreeView"
SelectedItemChanged="AvailableSignalsTreeView_SelectedItemChanged"
ItemsSource="{Binding Source={StaticResource available_signals_source}}"
>
<TreeView.CommandBindings>
<CommandBinding Command="ApplicationCommands.SelectAll"
Executed="AvailableSignalsTreeView_SelectAll"
CanExecute="AvailableSignalsTreeView_SelectAllCanExecute"/>
</TreeView.CommandBindings>
<TreeView.InputBindings>
<KeyBinding
Command="ApplicationCommands.SelectAll"
Modifiers="Ctrl"
Key="A"
/>
</TreeView.InputBindings>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource ="{Binding Path = bits}" >
<TextBlock
Text="{Binding Path = SignalName}"
/>
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<TextBlock
Text="{Binding Path = BitNumber}"
/>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
<TreeView.ContextMenu>
<ContextMenu>
<MenuItem Header="Add Bits to Signal" Click="AddBitToSignal" />
</ContextMenu>
</TreeView.ContextMenu>
</TreeView>
答案 0 :(得分:1)
试试这个:
// Helper to search up the VisualTree
private static T FindAnchestor<T>(DependencyObject current)
where T : DependencyObject
{
do
{
if (current is T)
{
return (T)current;
}
current = VisualTreeHelper.GetParent(current);
}
while (current != null);
return null;
}
private void AvailableSignalsTreeView_SelectedItemChanged(
object sender,
RoutedPropertyChangedEventArgs<Object> e)
{
var treeViewItem = FindAnchestor<TreeViewItem>((DependencyObject)e.OriginalSource);
}
答案 1 :(得分:0)
我认为我在想的是这个。基本上所选项目不是依赖项对象,所以我不能使用它们遍历树,而我必须使用itemcontainer生成器来获取容器。
我以为我昨天试了这个,不知道为什么它不起作用。
TreeViewItem tvi = tv.ItemContainerGenerator.ContainerFromItem(tv.SelectedItem) as TreeViewItem;