Silverlight:将事件附加到ItemsControl中的项目

时间:2012-05-03 17:10:58

标签: silverlight events templates itemscontrol

我正在尝试将事件链接到驻留在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中的项目的替代方法。

谢谢, 麦克

1 个答案:

答案 0 :(得分:0)

通常,为了附加事件,我会做一个部分类扩展,并给它一个可以绑定的命令的哈希表。在您的情况下,最简单的方法是定义和绑定列表后设置的事件。例如,集合上的属性Visible将检查是否定义了某个事件,如果是,则调用它。 E.g。

创建一个要查看的事件(OnRadioButtonChanged); 加载列表后附加到事件。 (清除列表以重新加载后分离事件)。 一旦事件存在,当切换可见性时,它将调用通风口。代码示例如下:

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

对我而言,这是更简洁的解决方案。 :)