I am trying to represent information from related datatables customers<-products into a treeview.
Due to performance issues I wanted to use Backgroundworker, but there is a gotcha - no GUI units (also TreeViewItem in other thread than STA possible).
So I defined my own "STA-thread-safe" class:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using System.ComponentModel;
namespace XXX.YYY
{
public class TreeViewNode: INotifyPropertyChanged
{
#region [ Header ]
private string _header;
public string Header
{
get
{
return _header;
}
set
{
_header = value;
OnNotifyPropertyChanged("Header");
}
}
#endregion
#region [ Tag ]
private string _tag;
public string Tag
{
get
{
return _tag;
}
set
{
_tag = value;
OnNotifyPropertyChanged("Tag");
}
}
#endregion
#region [ Items ]
private ObservableCollection<TreeViewNode> _items;
public ObservableCollection<TreeViewNode> Items
{
get
{
if (_items == null)
{
_items = new ObservableCollection<TreeViewNode>();
}
return _items;
}
set
{
_items = value;
OnNotifyPropertyChanged("Items");
}
}
#endregion
#region [ Property_Changed_Utilities ]
public event PropertyChangedEventHandler PropertyChanged;
private void OnNotifyPropertyChanged(String info)
{
// Note: Do not forget to add interface
// "INotifyPropertyChanged" to your class.
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
#endregion
public TreeViewNode()
{
}
}
}
And an Template in XAML for representing:
<TreeView Name="treeview"
ItemsSource="{Binding RelativeSource=
{RelativeSource Mode=FindAncestor,AncestorType=Window},
Path=TreeViewData}"
SelectedItemChanged="treeview_SelectedItemChanged">
<TreeView.Resources>
<Style TargetType="TreeViewItem">
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<TreeViewItem Header="{Binding Header}"
ItemsSource="{Binding Items}" />
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</TreeView.Resources>
<TreeView.ItemTemplate>
<DataTemplate>
<TreeViewItem Header="{Binding Header}"
ItemsSource="{Binding Items}" />
</DataTemplate>
</TreeView.ItemTemplate>
It is working so far - showing populated tree with subitems as wished. Also expanding/collapsing works...
BUT - no event is risen - there is no reaction on SelectedItemChanged.
Any help appreciated! Thank you very much in advance!