我有一个自定义控件,其中包含两个可以单击的元素(一个按钮和一个复选框)。我希望能够在XAML中为每个事件添加事件。
即。
<Control OnButtonClick="SomeEvent" OnCheckBoxClick="SomeOtherEvent" />
我不知道如何绑定这样的事件。有什么指针吗?
以下是用户控件的内容:
<Style TargetType="{x:Type local:DeleteCheckBox}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:DeleteCheckBox}">
<Grid>
<Label Height="25" BorderBrush="LightGray" BorderThickness="1" Padding="0" DockPanel.Dock="Top" FlowDirection="RightToLeft" Visibility="Hidden">
<Button x:Name="ImageButton1" Background="Transparent" Padding="0" BorderBrush="Transparent" Height="11" Width="11" Click="--Bind Function Here--" />
</Label>
<CheckBox Content="A0000" Click="--Bind Function Here--" IsChecked="True" Margin="0,10,10,0" VerticalContentAlignment="Center"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
答案 0 :(得分:1)
您需要将孩子的事件路由到您的顶级元素
在顶部元素的代码隐藏中,定义您需要的RoutedEvent
。然后,在构造函数中,订阅子项所需的事件,并在处理程序中,使用相同的args抛出与处理的子事件对应的新top元素事件。
注意:在Google上查找自定义路由事件。在这个例子中,你仍然需要复制按钮事件参数(如果你需要它们,以获得对当前按钮状态的访问等)到被吹捧的事件。
public class MyCustomControl : UserControl {
// Custom routed event
public static readonly RoutedEvent ButtonClickEvent = EventManager.RegisterRoutedEvent(
"ButtonClick", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyCustomControl));
// Custom CLR event associated to the routed event
public event RoutedEventHandler ButtonClick {
add { AddHandler(ButtonClickEvent, value); }
remove { RemoveHandler(ButtonClickEvent, value); }
}
// Constructor. Subscribe to the event and route it !
public MyCustomControl() {
theButton.Click += (s, e) => {
RaiseButtonClickEvent(e);
};
}
// Router for the button click event
private void RaiseButtonClickEvent(RoutedEventArgs args) {
// you need to find a way to copy args to newArgs (I never tried to do this, google it)
RoutedEventArgs newArgs = new RoutedEventArgs(MyCustomControl.ButtonClickEvent);
RaiseEvent(newArgs);
}
}