Reputation: 4002
<TreeView Name="MyTreeView" VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.VirtualizationMode="Recycling">
<TreeView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel IsItemsHost="True"/>
</ItemsPanelTemplate>
</TreeView.ItemsPanel>
<TreeView.Resources>
<DataTemplate DataType="{x:Type EntityType:MyFixedDevice}">
<TreeViewItem IsHitTestVisible="True" IsEnabled="True">
<TreeViewItem.Header>
<TextBlock Text="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource NameConverter}}"
IsHitTestVisible="True" IsEnabled="True"/>
</TreeViewItem.Header>
</TreeViewItem>
</DataTemplate>
</TreeView.Resources>
<TreeView.Items>
<TreeViewItem Header="Data Warehouse">
<TreeViewItem.Items>
<TreeViewItem Header="Platforms">
<TreeViewItem.Items>
<TreeViewItem ItemsSource="{Binding OBJS, Converter={StaticResource COBJSourceConverter}, ConverterParameter=Fixed}">
<TreeViewItem.Header>
<TextBlock Text="{Binding RelativeSource={RelativeSource Self},
Path=Parent.Items.Count,
StringFormat=Fixed Devices ({0})}">
</TextBlock>
</TreeViewItem.Header>
</TreeViewItem>
</TreeViewItem.Items>
</TreeViewItem>
</TreeViewItem.Items>
</TreeViewItem>
</TreeView.Items>
</TreeView>
How come left-click on the TreeViewItems that are created with DataTemplate does not select them? How come if I select them in code, I can't select them again or deselect them?
TreeViewItem selectedItem = MyTreeView.SelectedItem as TreeViewItem;
if(selectedItem != null) {
selectedItem.IsSelected = false;
MyTreeView.Focus();
}
I've tried to use the below to unselect TreeViewItems
in the TreeView
, but it only deselects the TreeViewItems
if they are statically set in the XAML, and not if they are created using an ItemsSource
and DataTemplate
?
Upvotes: 0
Views: 175
Reputation: 8656
Are you actually going to do something special with the TreeViewItem
template for your fixed devices (that requires altering the TreeViewItem
template?
On the face of it, it seems like you could let the TreeView
take care of its own items, and just use a simple template for your object representation: e.g.
<DataTemplate DataType="{x:Type EntityType:MyFixedDevice}">
<TextBlock Text="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource NameConverter}}" />
</DataTemplate>
I may have misunderstood what you're trying to achieve.
Upvotes: 1
Reputation: 17388
When you set ItemSource
the SelectedItem
corresponds to the DataContext
type as in your Type T
of the ItemSource
collection you set, not the actual TreeViewItem
.
hence why your cast fails.
Now when you create them in xaml directly without setting the ItemSource
, SelectedItem
is just the TreeViewitem
itself and the as
cast works fine.
Update:
It has nothing to with your DataTemplate
try this:
<Window.Resources>
<x:Array x:Key="someArray"
Type="sys:String">
<sys:String>Hello</sys:String>
<sys:String>World</sys:String>
</x:Array>
</Window.Resources>
<StackPanel>
<TreeView x:Name="MyTreeView"
ItemsSource="{DynamicResource someArray}" />
<Button Click="ButtonBase_OnClick"
Content="Some" />
</StackPanel>
and code-behind:
private void ButtonBase_OnClick(object sender, RoutedEventArgs e) {
TreeViewItem selectedItem = MyTreeView.SelectedItem as TreeViewItem;
if (selectedItem != null) {
selectedItem.IsSelected = false;
MyTreeView.Focus();
} else {
Debug.WriteLine("Not TreeViewitem");
Debug.WriteLine(MyTreeView.SelectedItem);
}
}
now when app is run click on an item and then click the Button
check the output Window and you'll see
Not TreeViewitem
Hello
DataTemplate
merely helps visualize a custom Datatype in the View. This is intended behavior when a collection is bound to the TreeView
Solution:
in your case to get the Actual TreeViewItem
try:
private void ButtonBase_OnClick(object sender, RoutedEventArgs e) {
TreeViewItem selectedItem =
MyTreeView.ItemContainerGenerator.ContainerFromItem(MyTreeView.SelectedItem) as TreeViewItem;
if (selectedItem == null)
return;
selectedItem.IsSelected = false;
MyTreeView.Focus();
}
^^ this supposedly does not work for HierarchicalDataTemplate
. Refer to this for more options.
Upvotes: 1