2012-05-03 10 views
1

itemscontrolにあるラジオボタンにイベントをリンクしようとしています。Silverlight:ItemsControl内のアイテムにイベントを添付する

マイテンプレートは以下の通りです:カスタムコントロールのための私は.csファイルで

<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> 

、私はItemsControlのためのテンプレートの一部を持っている、と私はradioButtonsItemsControlではない

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

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

イベントを添付する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); 
     } 
    } 

私にとっては、よりクリーンでシンプルなソリューションです。 :)