2012-05-03 77 views
1

我試圖將事件鏈接到駐留在項目控件中的單選按鈕。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事件仍然應該稍後在我的項目控件中單擊時註冊。 radioButtonsItemsControlMouseLeftButtonDown:

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

,當我在我的ItemsControl雖然點擊這個永遠不會觸發。

不知道我正在討論這個正確的方法,所以我打開其他方法將事件附加到ItemsControls中的項目。

謝謝, 邁克

回答

0

一般來說,附加的情況下,我會做一個局部類擴展,並給它可能被綁定於命令的哈希表。在你的情況下,最簡單的方法是在列表綁定後定義和設置事件。例如,集合上的屬性Visible將檢查是否定義了某個事件,如果是,則調用它。例如。

創建一個事件來查看(OnRadioButtonChanged); 附加到列表加載後的事件。 (一旦列表被清除以重新加載,則分離事件)。 一旦事件存在,當可見性切換時,它將調用通風口。代碼示例如下:

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

對我來說,這是更簡潔的解決方案。 :)

相關問題