如何获取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 有很多数据时,运行时的复杂性不是很好。有没有更好的解决方案?
我想用父 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 有很多数据时,运行时的复杂性不是很好。有没有更好的解决方案?