New to Telerik UI for WPF? Download free 30-day trial

Working with ItemPrepared Event

The purpose of this tutorial is to show you how to work with the RadTreeView's ItemPrepared event. This event occurs when a child RadTreeViewItem has been prepared and is now ready for use. The main goal of this event is to perform binding of RadTreeViewItem properties to the data objects.

The example shown in this tutorial will demonstrate you how to bind the check state of individual treeview items to a ToggleState property of a class.

In few words, the approaches that you should follow are:

  • Create a sample data source

    For the purpose of this example the following business objects will be used:

        public class DataItem 
        { 
            public DataItem() 
            { 
                this.Items = new List<DataItem>(); 
            } 
     
            public string Name 
            { 
                get; 
                set; 
            } 
     
            public System.Windows.Automation.ToggleState CheckState 
            { 
                get; 
                set; 
            } 
     
            public List<DataItem> Items 
            { 
                get; 
                set; 
            } 
        } 

    The CheckState property of the DataItem class will be bound to the CheckState property of the RadTreeViewItem.

        public class RawDataSource : List<DataItem> 
        { 
            public RawDataSource() 
            { 
                Random rand = new Random( ( int )DateTime.Now.Ticks ); 
                for ( int i = 1; i < 11; i++ ) 
                { 
                    DataItem item = new DataItem() 
                    { 
                        Name = String.Format( "Item {0}", i.ToString() ), 
                        CheckState = GetToggleState( rand.Next( 0, 3 ) ) 
                    }; 
                    for ( int j = 1; j < 11; j++ ) 
                    { 
                        DataItem subItem = new DataItem() 
                        { 
                            Name = String.Format( "Item {0}.{1}", i.ToString(), j.ToString() ), 
                            CheckState = GetToggleState( rand.Next( 0, 3 ) ) 
                        }; 
                        item.Items.Add( subItem ); 
                    } 
                    this.Add( item ); 
                } 
            } 
     
            private System.Windows.Automation.ToggleState GetToggleState( int code ) 
            { 
                switch ( code ) 
                { 
                    case 0: 
                        return System.Windows.Automation.ToggleState.Off; 
                    case 1: 
                        return System.Windows.Automation.ToggleState.On; 
                    case 2: 
                        return System.Windows.Automation.ToggleState.Indeterminate; 
                    default: 
                        return System.Windows.Automation.ToggleState.Off; 
                } 
            } 
        } 

    The RawDataSource does nothing special, except for initializing the sample data for the RadTreeView. This is the data source for the treeview.

  • Add a new RadTreeView declaration. Enable the following properties:

    • IsOptionElementsEnabled
    • IsTriStateMode

        <telerik:RadTreeView x:Name="radTreeView" IsOptionElementsEnabled="True" IsTriStateMode="True"/> 
  • Declare a RawDataSource object as a resource in your XAML and set the RadTreeView's ItemsSource property.

        <UserControl.Resources> 
            <example:RawDataSource x:Key="DataSource"/> 
        </UserControl.Resources> 
        .... 
        <telerik:RadTreeView x:Name="radTreeView"  
                             IsOptionElementsEnabled="True"  
                             IsTriStateMode="True"  
                             ItemsSource="{StaticResource DataSource}"/> 
  • Declare a new HierarchicalDataTemplate in your XAML resources and set the RadTreeView's ItemTemplate property.

        <Window.Resources> 
            <example:RawDataSource x:Key="DataSource"/> 
            <HierarchicalDataTemplate x:Key="ItemTemplate" ItemsSource="{Binding Items}"> 
                <StackPanel Orientation="Horizontal"> 
                    <TextBlock Text="{Binding Name}" /> 
                </StackPanel> 
            </HierarchicalDataTemplate> 
        </Window.Resources> 
        .... 
        <telerik:RadTreeView x:Name="radTreeView"  
                             IsOptionElementsEnabled="True" 
                             IsTriStateMode="True" 
                             ItemsSource="{StaticResource DataSource}"  
                             ItemTemplate="{StaticResource ItemTemplate}"/> 
  • The final and most important step is to attach to the ItemPrepared event of the RadTreeView.

        <telerik:RadTreeView x:Name="radTreeView" 
                                   IsOptionElementsEnabled="True" 
                                   IsTriStateMode="True" 
                                   ItemsSource="{StaticResource DataSource}" 
                                   ItemTemplate="{StaticResource ItemTemplate}" 
                                   ItemPrepared="radTreeView_ItemPrepared"/> 

    Switch to the code-behind and in the event handler add a code, synchronizing the CheckState property of the RadTreeViewItem object with the CheckState property of the DataItem object.

        private void radTreeView_ItemPrepared( object sender, Telerik.Windows.Controls.RadTreeViewItemPreparedEventArgs e ) 
        { 
            e.PreparedItem.CheckState = ( e.PreparedItem.Item as DataItem ).CheckState; 
        } 
  • The example so far is almost complete. However, there are some drawbacks. The RadTreeViewItem's CheckState property is synchronized just once. If the user checks\unchecks a specific treeview item, the source object will not be updated. In order to solve this problem you should attach to the RadTreeViewItem's Checked and Unchecked events.

        private void radTreeView_ItemPrepared( object sender, Telerik.Windows.Controls.RadTreeViewItemPreparedEventArgs e ) 
        { 
            e.PreparedItem.CheckState = ( e.PreparedItem.Item as DataItem ).CheckState; 
            e.PreparedItem.Checked += new EventHandler<Telerik.Windows.RadRoutedEventArgs>( PreparedItem_Checked ); 
            e.PreparedItem.Unchecked += new EventHandler<Telerik.Windows.RadRoutedEventArgs>( PreparedItem_Unchecked ); 
        } 
     
        void PreparedItem_Unchecked( object sender, Telerik.Windows.RadRoutedEventArgs e ) 
        { 
            RadTreeViewItem item = sender as RadTreeViewItem; 
            if ( item != null ) 
            { 
                ( item.Item as DataItem ).CheckState = System.Windows.Automation.ToggleState.Off; 
            } 
        } 
     
        void PreparedItem_Checked( object sender, Telerik.Windows.RadRoutedEventArgs e ) 
        { 
            RadTreeViewItem item = sender as RadTreeViewItem; 
            if ( item != null ) 
            { 
                ( item.Item as DataItem ).CheckState = System.Windows.Automation.ToggleState.On; 
            } 
        } 
In this article