Alternatives?
This works fine if the control template is placed in the same scope as the event handler code such as the page or user control resources section. However, if you try to move the template code to another resources section that doesn't have access to the event handler code (DropDownToggle_Click) you'll run into problems . What if you want to put the control template in a merged resource dictionary (similar to an external CSS stylesheet to give a web analogy) and can't hard-code the click event into the control template since you don't know where the event handler will be defined at that point? Although you can certainly write a custom control that derives from AutoCompleteBox in this case (which would be recommended if you'll re-use the control across multiple pages or user controls), another solution is to hook-up the ToggleButton's Click event when the AutoCompleteBox control first loads; see Listing Three.
void SilverlightApplication_Loaded(object sender, RoutedEventArgs e)
{
HookAutoCompleteBoxEvents();
}
void HookAutoCompleteBoxEvents()
{
AutoCompleteBox[] boxes = { this.JobIDAutoCompleteBox,
this.EmployeeAutoCompleteBox };
foreach (var box in boxes)
{
Grid grid = VisualTreeHelper.GetChild(box, 0) as Grid;
ToggleButton tb = grid.Children[1] as ToggleButton;
if (tb != null) tb.Click += DropDownToggle_Click;
}
}
When the Silverlight application Loaded event is called it calls the HookAutoCompleteBoxEvents() method. Within HookAutoCompleteBoxEvents() an array of AutoCompleteBox controls is iterated through to locate the ToggleButton for each control and attach a Click event handler to it. Doing this avoids hard-coding the event handler in the control template so that it can be defined just about anywhere you'd like without running into code scoping issues.
If you plan on using the customized AutoCompleteBox control in several places it may be worth the time to create a custom control that derives from AutoCompleteBox to avoid having to put the ToggleButton event handler code and the HookAutoCompleteBoxEvents code into each page or user control.



