我正在尝试将事件链接到驻留在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 :(得分:0)
通常,为了附加事件,我会做一个部分类扩展,并给它一个可以绑定的命令的哈希表。在您的情况下,最简单的方法是定义和绑定列表后设置的事件。例如,集合上的属性Visible将检查是否定义了某个事件,如果是,则调用它。 E.g。
创建一个要查看的事件(OnRadioButtonChanged); 加载列表后附加到事件。 (清除列表以重新加载后分离事件)。 一旦事件存在,当切换可见性时,它将调用通风口。代码示例如下:
public string Visibility
{
get
{
return __fVisibility;
}
set
{
__fVisibility = value;
this.NotifyPropertyChanged("Visibility");
if (!object.ReferenceEquals(OnVisibilityChanged, null))
OnVisibilityChanged(null);
}
}
对我而言,这是更简洁的解决方案。 :)