Here's how I solved this. I extended the TreeView class to include SelectedItem functionality:
public class ExtendedTreeView : TreeView
{
public ExtendedTreeView()
: base()
{
this.SelectedItemChanged += new RoutedPropertyChangedEventHandler<object>(___ICH);
}
void ___ICH(object sender, RoutedPropertyChangedEventArgs<object> e)
{
if (SelectedItem != null)
{
SetValue(SelectedItem_Property, SelectedItem);
}
}
public object SelectedItem_
{
get { return (object)GetValue(SelectedItem_Property); }
set { SetValue(SelectedItem_Property, value); }
}
public static readonly DependencyProperty SelectedItem_Property = DependencyProperty.Register("SelectedItem_", typeof(object), typeof(ExtendedTreeView), new UIPropertyMetadata(null));
}
Here are my hierarchy classes for the TreeView:
public class CountryReportsHierarchy
{
IIsesServiceChannel IsesService;
public ObservableCollection<tbArticleCategory> ArticleCategoryList;
public ObservableCollection<ArticleCategoriesHierarchy> ArticleCategoriesHierarchyCollection { get; set; }
public string Name { get; set; }
public CountryReportsHierarchy(IIsesServiceChannel isesService)
{
this.IsesService = isesService;
ArticleCategoryList = new ObservableCollection<tbArticleCategory>(IsesService.GetArticleCatagoryTitles());
ArticleCategoriesHierarchyCollection = new ObservableCollection<ArticleCategoriesHierarchy>();
foreach (var a in ArticleCategoryList)
{
ArticleCategoriesHierarchyCollection.Add(new ArticleCategoriesHierarchy(IsesService, a.Category) { Name = a.CategoryTitle });
}
}
}
public class ArticleCategoriesHierarchy
{
IIsesServiceChannel IsesService;
public ObservableCollection<tbArticleType> ArticleTypeList;
public ObservableCollection<ArticleTypesHierarchy> ArticleTypesHierarchyCollection { get; set; }
public string Name { get; set; }
public ArticleCategoriesHierarchy(IIsesServiceChannel isesService, string articleCategoryType)
{
this.IsesService = isesService;
ArticleTypeList = new ObservableCollection<tbArticleType>(IsesService.GetArticleCategoryTypes(articleCategoryType));
ArticleTypesHierarchyCollection = new ObservableCollection<ArticleTypesHierarchy>();
foreach (var a in ArticleTypeList)
{
ArticleTypesHierarchyCollection.Add(new ArticleTypesHierarchy() { Name = a.ArticleTitle });
}
}
}
public class ArticleTypesHierarchy
{
public string Name { get; set; }
}
I then bound my new ExtendedTreeView Selected item to a ArticleTypesHierarchy
property in my ViewModel:
<cntrls:ExtendedTreeView ItemsSource="{Binding countryReportsHierarchy}" SelectedItem_="{Binding SelectedArticleTitle, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectedItemChanged">
<i:InvokeCommandAction Command="{Binding ArticleCategoryTitleSelectionChangedCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type t:CountryReportsHierarchy}"
ItemsSource="{Binding ArticleCategoriesHierarchyCollection}">
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type t:ArticleCategoriesHierarchy}"
ItemsSource="{Binding ArticleTypesHierarchyCollection}">
<TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type t:ArticleTypesHierarchy}">
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</TreeView.Resources>
</cntrls:ExtendedTreeView>
ViewModel passing in the ArticleTypesHierarchy.Name
(My selected TreeView string) argument:
public ReportViewModel()
{
countryReportsHierarchy = new ObservableCollection<CountryReportsHierarchy>(new[]{
new CountryReportsHierarchy(IsesService){Name = CountryReportTitle}});
}
private ArticleTypesHierarchy _SelectedArticleTitle;
public ArticleTypesHierarchy SelectedArticleTitle
{
get { return _SelectedArticleTitle; }
set
{
_SelectedArticleTitle = value;
OnPropertyChanged("SelectedArticleTitle");
}
}
private void ArticleCategoryTitleSelectionChangedCommandAction()
{
GetData(SelectedArticleTitle.Name)
}