Nov 30, 2012

Silverlight: Access template control programmatically

If you are working on a Silverlight application, it's very imperative that you will end up wanting to assess a control from a design template.

If let's say I have a template where a CheckBox control is defined and if I want to access this control in my code behind, there is no direct way to do it.

... <ControlTemplate ..> <Grid>... <CheckBox x:Name="chkAll" .../> </Grid> </ControlTemplate /> ...
The following method will recusively look for this control  hiding anywhere in the control template against its name and return it when found.

  private object GetChildControl( DependencyObject parent, string  name)
  {
       Object  control = null ;
       int  count = VisualTreeHelper.GetChildrenCount(parent);
       for  (int  counter = 0; counter < count; counter++)
       {
           control = VisualTreeHelper.GetChild(parent, counter);
           //name supplied then Return Control if the control name matches  
           if  ((control as  DependencyObject).GetValue(NameProperty).ToString() == name)
               return  control;
           else  //Search Recursively if not found
           {
               control = GetChildControl(control as  DependencyObject, name);
               if  (control != null )
                         return  control;
           }
       }
             return  null ;
   }
 

You can get the reference of the control searching against its name.
CheckBox checkBox = (CheckBox)GetChildControl(this,"chkAll");