2012-05-03 5 views
1

Я пытаюсь связать события с моими переключателями, которые находятся в элементе управления itemscontrol.Silverlight: привязка событий к элементам в ItemsControl

Мой шаблон ниже:

<ItemsControl x:Name="RadioButtonsItemsControl" Height="auto" Width="auto" ItemsSource="{TemplateBinding MapLayers}" > 

         <ItemsControl.ItemsPanel> 
          <ItemsPanelTemplate> 

           <StackPanel Orientation="{TemplateBinding RadioButtonOrientation}" Margin="5"/> 
          </ItemsPanelTemplate> 
         </ItemsControl.ItemsPanel> 

         <ItemsControl.ItemTemplate> 
          <DataTemplate> 

           <RadioButton Content="{Binding ID}" IsChecked="{Binding Visible, Mode=TwoWay}" 
            IsEnabled = "{Binding IsInScaleRange}" 
            ToolTipService.ToolTip="" 
            GroupName="BaseLayer" 
            Foreground="{TemplateBinding ForeGroundBrush}" FontSize="11"> 

           </RadioButton> 
          </DataTemplate> 
         </ItemsControl.ItemTemplate> 
        </ItemsControl> 

В мой файл .cs для пользовательского элемента управления, у меня есть часть шаблона для ItemsControl, и я прикрепить событие

public override void OnApplyTemplate() 
    { 
     base.OnApplyTemplate(); 

     radioButtonsItemsControl = GetTemplateChild("RadioButtonsItemsControl") as ItemsControl; 
     if (radioButtonsItemsControl != null) radioButtonsItemsControl.MouseLeftButtonDown += radioButtonsItemsControlMouseLeftButtonDown; 
    } 

radioButtonsItemsControl не является равный null (и на данном этапе еще не заполнен радиокнопками), но событие radioButtonsItemsControlMouseLeftButtonDown должно быть зарегистрировано позже, когда я нажимаю внутри элемента управления элементами.

void radioButtonsItemsControlMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     RadioButton radioButton = e.OriginalSource as RadioButton; 
     if (radioButton != null) radioButton.Checked += OnChecked; 
    } 

это никогда не срабатывает, когда я нажимаю в моем ItemsControl, хотя: radioButtonsItemsControlMouseLeftButtonDown.

Не уверен, что я собираюсь сделать это правильно, поэтому я открыт для альтернативных методов прикрепления событий к элементам внутри ItemsControls.

Спасибо, Майк

ответ

0

Вообще, чтобы прикрепить событие, я хотел бы сделать расширение частичного класса и дать ему хэш-таблицу команд, которые могут быть связаны с. В вашем случае самым простым способом было бы определить и событие, которое установлено после привязки списка. Например, свойство Visible, в наборе будет проверять, определено ли какое-либо событие, и если да, вызовите его. Например.

Создать событие для просмотра (OnRadioButtonChanged); Прикрепите к событию ПОСЛЕ загрузки списка. (отсоедините событие после удаления списка для перезагрузки). Как только событие существует, когда видимость переключается, он будет вызывать вентиляцию. Пример кода приведен ниже:

public string Visibility 
    { 
     get 
     { 
      return __fVisibility; 
     } 
     set 
     { 
      __fVisibility = value; 
      this.NotifyPropertyChanged("Visibility"); 
      if (!object.ReferenceEquals(OnVisibilityChanged, null)) 
       OnVisibilityChanged(null); 
     } 
    } 

Это для меня более чистое и простое решение. :)

Смежные вопросы