This is a migrated thread and some comments may be shown as answers.

How to get Parent Item

3 Answers 217 Views
TreeView
This is a migrated thread and some comments may be shown as answers.
This question is locked. New answers and comments are not allowed.
Vit100
Top achievements
Rank 1
Vit100 asked on 31 Aug 2010, 03:09 AM
Hi
I have DataModel 
Country -> List<City>
and this is shown in RadTreeView with load on demand.

I need to know at any time full path to selection in TreeView ( I call different function depending on Selectiion in Tree).
How to achive this?

If I take example from documentation : http://www.telerik.com/help/silverlight/radtreeview-how-to-get-previous-next-parent-sibling-node.html
it gives error.
I need to know at any time what is full path to selection in TreeView. How to achive this.
Sample project attached.
Pls help.
 
           <DataTemplate x:Key="PopulationTemplate">
               <StackPanel Orientation="Horizontal">
                   <TextBlock Text="{Binding Name}"/>
                   <TextBlock Text=": "/>
                   <TextBlock Text="{Binding Count}"/>
               </StackPanel>
           </DataTemplate>
           <telerik:HierarchicalDataTemplate x:Key="CountriesTemplate"
                                             ItemsSource="{Binding Cities}"
                                             ItemTemplate="{StaticResource PopulationTemplate}">
               <TextBlock Text="{Binding Name}"/>
           </telerik:HierarchicalDataTemplate>
       </Grid.Resources>
       <telerik:RadTreeView ItemsSource="{Binding Countries}" IsLoadOnDemandEnabled="True"
                           LoadOnDemand="RadTreeView_LoadOnDemand"
                           ItemTemplate="{StaticResource CountriesTemplate}"
                            IsLineEnabled="True"
                            SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
                            ItemPrepared="RadTreeView_ItemPrepared"
                            SelectionChanged="RadTreeView_SelectionChanged"/>

public partial class MainPage : UserControl
    {
        Model.ViewModel vm;
        public MainPage()
        {
            InitializeComponent();
            vm = new Model.ViewModel();
            this.DataContext = vm;
        }
  
        private void RadTreeView_LoadOnDemand(object sender, Telerik.Windows.RadRoutedEventArgs e)
        {
            RadTreeViewItem currentItem = e.OriginalSource as RadTreeViewItem;
              Country country = currentItem.Item as Country;
            if (country != null)
            {
                vm.LoadCities(country);
            }
  
            City city = currentItem.Item as City;
            if (city != null)
            {
                currentItem.IsLoadOnDemandEnabled = false;
                var c = currentItem.ParentItem.Item as Country;
                vm.LoadExtraData(c, city);
            }
        }
  
        private void RadTreeView_ItemPrepared(object sender, RadTreeViewItemPreparedEventArgs e)
        {
            RadTreeViewItem item = e.PreparedItem as RadTreeViewItem;
            if (item != null && item.Item is City)
            {
                item.IsLoadOnDemandEnabled = false;
            }
          }
  
        private void RadTreeView_SelectionChanged(object sender, Telerik.Windows.Controls.SelectionChangedEventArgs e)
        {
  
            // Get a reference to the treeview
            Telerik.Windows.Controls.RadTreeView treeView = sender as Telerik.Windows.Controls.RadTreeView;
            // Get the currently selected items
            ObservableCollection<Object> selectedItems = treeView.SelectedItems;
  
            //Here always null!!!!!!!!!!!!!!!!!!!!!!!!!!!! because selectedItem is not RadTreeViewItem - it is Country or City
            RadTreeViewItem item = selectedItems[0] as RadTreeViewItem;
            //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  
            // Get the previous item and the previous sibling item
            RadTreeViewItem previousItem = item.PreviousItem;
            RadTreeViewItem previousSiblingItem = item.PreviousSiblingItem;
  
            // Get the next item and the next sibling item
            RadTreeViewItem nextItem = item.NextItem;
            RadTreeViewItem nextSiblingItem = item.NextSiblingItem;
  
            // Get the parent item and the root item
            RadTreeViewItem parentItem = item.ParentItem;
            RadTreeViewItem rootItem = item.RootItem;
          }
    }

public class ViewModel : ModelBase
    {
        public ObservableCollection<Country> Countries { get; set; }
        public ViewModel()
        {
            Countries = new ObservableCollection<Country>();
            LoadCountries();
        }
  
        private Country _SelectedCountry;
        public Country SelectedCountry
        {
            get { return _SelectedCountry; }
            set { _SelectedCountry = value; RaisePropertyChanged("SelectedCountry"); }
        }
  
        private City _SelectedCity;
        public City SelectedCity
        {
            get { return _SelectedCity; }
            set { _SelectedCity = value; RaisePropertyChanged("SelectedCity"); }
        }
  
        private object _SelectedItem;
        public object SelectedItem
        {
            get { return _SelectedItem; }
            set { _SelectedItem = value; RaisePropertyChanged("SelectedItem"); }
        }
  
  
        public void LoadCountries()
        {
            Countries.Add(new Country() { Name = "US" });
            Countries.Add(new Country() { Name = "Canada" });
        }
  
        public void LoadCities(Country country)
        {
            if (country.Name == "US")
            {
                country.Cities.Add(new City() { Name = "NY", Count = 1 });
                country.Cities.Add(new City() { Name = "Atlanta", Count = 2 });
            }
  
            if (country.Name == "Canada")
            {
                country.Cities.Add(new City() { Name = "Toronto", Count = 3 });
                country.Cities.Add(new City() { Name = "Vancouver", Count = 4 });
            }
        }
  
       //here I call method that takes only country - means root item selected in the tree.
        public void LoadExtraData(Country country)
        {
            //call to WCF with parameter country
            SelectedCountry = country;
        }
  
        // here  I need full path - country and city..
        public void LoadExtraData(Country country, City city)
        {
            //call to WCF with parameters country and city
            SelectedCountry = country;
            SelectedCity = city;
        }
     }

3 Answers, 1 is accepted

Sort by
0
Vit100
Top achievements
Rank 1
answered on 31 Aug 2010, 04:55 PM
Update:
I use code below in SelectionChanged event or RadTreeView
RadTreeView treeView = sender as Telerik.Windows.Controls.RadTreeView;
RadTreeViewItem p = treeView.ContainerFromItemRecursive(treeView.SelectedItem);
and check type of item later and if it is child type I use

p.Item.ParentItem.Item to get parent..

Is this right way?
0
Accepted
Hristo
Telerik team
answered on 01 Sep 2010, 11:46 AM
Hello Vit100,

You can use the FullPath property of RadTreeViewItem. Also you can register an event handler for the Selected event of the RadTreeView and retrieve the selected element.
In order to receive meaningful string representation of selected element path you can do the following:
1. Override the ToString() method of the business object you are binding to the treeview;
Or
2. Set the TextSearch.TextPath attached property of RadTreeView to property where the string will come from.

Also you should use the SelectedContainer (returns RadTreeViewItem that holds appropriate business item) property instead SelectedItem.

Last, I'm attaching a sample project demonstrating how to implement the suggested solution.

Greetings,
Hrsito Milyakov
the Telerik team
Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
0
Vit100
Top achievements
Rank 1
answered on 01 Sep 2010, 02:06 PM
thanks - yes,

RadTreeViewItem

 

 

p = treeView.SelectedContainer

 


is an answer..
Tags
TreeView
Asked by
Vit100
Top achievements
Rank 1
Answers by
Vit100
Top achievements
Rank 1
Hristo
Telerik team
Share this question
or