I have a WPF TreeView control defined like this:
<TreeView x:Name="samplesTree" MouseDoubleClick="samplesTree_MouseDoubleClick"
KeyUp="samplesTree_KeyUp"
SelectedItemChanged="samplesTree_SelectedItemChanged"
IsVisibleChanged="treeView_IsVisibleChanged">
</TreeView>
I track what nodes have been expanded or collapsed using this code:
private List<object> SamplesExpandedTags = new List<object>();
private void stag_Collapsed(object sender, RoutedEventArgs e)
{
object tag = (sender as TreeViewItem).Tag;
if (SamplesExpandedTags.Contains(tag))
SamplesExpandedTags.Remove(tag);
}
private void stag_Expanded(object sender, RoutedEventArgs e)
{
object tag = (sender as TreeViewItem).Tag;
if (!SamplesExpandedTags.Contains(tag))
SamplesExpandedTags.Add(tag);
}
...
// Items are created in code behind, not using binding to DataSource
TreeViewItem item = new TreeViewItem();
item.Header = tv.NazevTypuVyrobku;
item.Tag = string.Format("TV{0}",tv.TypVyrobkuID);
item.Expanded += new RoutedEventHandler(stag_Expanded);
item.Collapsed += new RoutedEventHandler(stag_Collapsed);
By debugging I have found, that when the child node is being Collapsed then also Collapsed
event of parent node fires, so stag_Collapsed
is run for the whole chain of parent elements of the actually collapsed node.
I have added this code at the beginning of the stag_Collapsed
method:
if ((sender as TreeViewItem).IsExpanded) return;
Now the code works as it should, but why the Collapsed event fires on all the parent TreeViewItems and not only on the TreeViewItem actually being collapsed? I would expect that IsExpanded
property is allways false
on sender.
The suggested solution to set:
e.Handled = true;
is not bullet proof, since this code:
subitem.Expanded += new RoutedEventHandler(stag_Expanded);
subitem.Expanded += new RoutedEventHandler(sampleOperation_Expanded);
subitem.Collapsed += new RoutedEventHandler(stag_Collapsed);
is working differently then this code:
subitem.Expanded += new RoutedEventHandler(sampleOperation_Expanded);
subitem.Expanded += new RoutedEventHandler(stag_Expanded);
subitem.Collapsed += new RoutedEventHandler(stag_Collapsed);
In the first case sampleOperation_Expanded
does not get executed at all because of e.Handled = true;
command.
I thought that order of event handler execution should not be significant?