В пользовательском элементе управления WPF возможно ли связывание дочернего элемента с шаблоном с событием элемента управления? - PullRequest
1 голос
/ 28 октября 2010

У меня есть пользовательский элемент управления, который содержит два элемента, которые можно щелкнуть (кнопка и флажок).Я хотел бы иметь возможность помещать события в 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>

1 Ответ

1 голос
/ 28 октября 2010

Вам нужно направить события от ваших детей к вашему верхнему элементу.
В коде вашего верхнего элемента определите нужные вам RoutedEvent. Затем в конструкторе подпишитесь на необходимые дочерние события, а в обработчики добавьте новое событие верхнего элемента, соответствующее вашему обработанному дочернему событию, с такими же аргументами.

Пример

Примечание: ищите пользовательские перенаправленные события в 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);
    }
}
...