如何获取TreeViewItem的父对象

How to get the parant object of TreeViewItem

我想用父 Treeview 节点的值在我的 ViewModel 中设置一个 属性,但无法获得正确的方法。 这是代码:

private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    if (e.NewValue.GetType() == typeof(Customer))
    {
         this.MainViewModel.SelectedCustomer = (Customer)e.NewValue;
         this.MainViewModel.FinishConSiteCommand.RaiseCanExecuteChanged();
    }
    else
    {
        this.MainViewModel.SelectedConstructionSite = (ConstructionSite)e.NewValue;
        // here I want to set "this.MainViewModel.SelectedCustomer" this is the parent node.
        this.MainViewModel.FinishConSiteCommand.RaiseCanExecuteChanged();
    }
}

还有XAML

<TreeView x:Name="treeView" ItemsSource="{Binding ConstructionSiteDictionary.Values}" SelectedItemChanged="TreeView_SelectedItemChanged">
                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding ConstructionSites}">
                        <Label Content="{Binding DisplayableInfos}"/>
                        <HierarchicalDataTemplate.ItemTemplate>
                            <DataTemplate>
                                <Label Content="{Binding Name}"/>
                            </DataTemplate>
                        </HierarchicalDataTemplate.ItemTemplate>
                    </HierarchicalDataTemplate>
                </TreeView.ItemTemplate>
            </TreeView

谁能帮帮我?谢谢! :)

好的,我找到了解决我自己问题的方法:

        private void TreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            if (e.NewValue.GetType() == typeof(Customer))
            {
                this.MainViewModel.SelectedCustomer = (Customer)e.NewValue;
                this.MainViewModel.FinishConSiteCommand.RaiseCanExecuteChanged();
            }
            else
            {
                this.MainViewModel.SelectedConstructionSite = (ConstructionSite)e.NewValue;
                Customer customer = null;
                foreach (Customer c in this.MainViewModel.ConstructionSiteDictionary.Values)
                {
                    foreach (ConstructionSite site in c.ConstructionSites)
                    {
                        ConstructionSite selecetedSite = (ConstructionSite)e.NewValue;
                        if (site == selecetedSite)
                            customer = c;
                    }
                }
                this.MainViewModel.SelectedCustomer = customer;
                this.MainViewModel.FinishConSiteCommand.RaiseCanExecuteChanged();
            }
        }

这很好用,但是当 ConstructionSiteDictionary 有很多数据时,运行时的复杂性不是很好。有没有更好的解决方案?