Добрый день.
Что есть - treeview с привязанным HierarchicalDataTemplate. Хочу сделать Multiselection. Нашел пример
https://www.codeproject.com/Articles/24585/WPF-Mul... Вначале проблема была в том, что автор примера использует TreeViewItem как элементы дерева, в то время как у меня есть свой кастомный класс для элементов (TreeElem) и в sender у SelectedItemChanged приходить объект этого класса. Вначале я хотел получить из него TreeViewItem , но чтобы я не пытался сделать не получалось. Тогда я решил вместо SelectedItemChanged использовать какой-нибудь другой ивент и им стал PreviewMouseDown.
Вот такой код в XAML:
<TreeView x:Name="PrjTreeViev"
Margin="10,10,0,37"
HorizontalAlignment="Left"
Width="174"
>
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<EventSetter Event="PreviewMouseDown" Handler="SelectionChange" />
</Style>
</TreeView.ItemContainerStyle>
<TreeView.ItemTemplate >
<HierarchicalDataTemplate ItemsSource="{Binding Path=Elems}" x:Name="Itemsq" >
<StackPanel Orientation="Horizontal" AllowDrop="True" x:Name="panel">
<Image Source="{Binding IconSource}" Margin ="0 0 10 0"/>
<TextBlock Text="{Binding Name}" />
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
И вот, для начала, "SelectionChange:
void SelectionChange(object sender, MouseButtonEventArgs e)
{
Debug.WriteLine("TEST+"+ e.OriginalSource);
if (sender is TreeViewItem)
{
Debug.WriteLine("TEST2+" + sender);
TreeViewItem treeviewItem = sender as TreeViewItem;
Debug.WriteLine("TEST3+" + (treeviewItem.Header as TreeElem).Name);
}
e.Handled;
}
Тут я хотел просто хотел узнать, что за элементы у меня выделяются. Вроде определяются правильно, но... экспендер не работает. Как выяснилось, но почему-то, в превью при e.Handled не хочет ни в какую нажиматься экспендер. Тогда я чутка модифицировал код:
void SelectionChange(object sender, MouseButtonEventArgs e)
{
if (!(e.OriginalSource is System.Windows.Shapes.Path)) // если нажатый объект экспендер - то отложим чутка e.Handled
{
if (sender is TreeViewItem)
{
Debug.WriteLine("Что за тип +" + sender);
TreeViewItem treeviewItem = sender as TreeViewItem;
Debug.WriteLine("Имя выделенного элемента +" + (treeviewItem.Header as TreeElem).Name);
}
e.Handled;
else
{
System.Threading.Timer timer = null;
timer = new System.Threading.Timer((obj) =>
{
postponed(e);
timer.Dispose();
},
null, 1000, System.Threading.Timeout.Infinite);
}
}
private void postponed(MouseButtonEventArgs e)
{
Debug.WriteLine("timer");
e.Handled = true;
}
Теперь вроде бы все хорошо, элементы экспендядтся как нужно, но... При нажатии на элемент на уровень ниже по иерархии, чет высший в sender в SelectionChange приходит элемент выше по иерархии того на который я нажал.
Как это исправить? Возможно не стоить использовать Preview? Но тогда, что использовать?