Вопрос

У меня есть ListBox, стиль которого определен для ListBoxItems.Внутри этого стиля у меня есть несколько ярлыков и кнопка.Для одной этой кнопки я хочу определить событие щелчка, которое можно будет обрабатывать на моей странице (или на любой странице, использующей этот стиль).Как создать обработчик событий на моей странице WPF для обработки события из моего стиля ListBoxItems?

Вот мой стиль (только затронутый код):

<Style x:Key="UsersTimeOffList"  TargetType="{x:Type ListBoxItem}">
... 
<Grid>
<Button x:Name="btnRemove" Content="Remove" Margin="0,10,40,0" Click="btnRemove_Click" />
</Grid>
</Style>

Спасибо!

Это было полезно?

Решение

Взгляни на Маршрутизированнаякомандас.

Определите свою команду в myclass где-нибудь следующим образом:

    public static readonly RoutedCommand Login = new RoutedCommand();

Теперь определите свою кнопку с помощью этой команды:

    <Button Command="{x:Static myclass.Login}"  />  

Вы можете использовать CommandParameter для получения дополнительной информации.

И последнее, но не менее важное: начните слушать свою команду:

В конструкторе класса, который вы хотите сделать что-нибудь приятное, вы помещаете:

    CommandBindings.Add(new CommandBinding(myclass.Login, ExecuteLogin));

или в XAML:

   <UserControl.CommandBindings>
        <CommandBinding Command="{x:Static myclass.Login}" Executed="ExecuteLogin" />
   </UserControl.CommandBindings>

И вы реализуете делегат, необходимый CommandBinding:

    private void ExecuteLogin(object sender, ExecutedRoutedEventArgs e)
    {
          //Your code goes here... e has your parameter!
    }

Вы можете начать слушать эту команду повсюду в вашем визуальном дереве!

Надеюсь это поможет

PS Вы также можете определить CommandBinding с помощью делегата CanExecute, который даже отключит вашу команду, если CanExecute так скажет :)

PPS Вот еще пример: RoutedCommands в WPF

Другие советы

Как сообщил Arcturus, RoutedCommands — отличный способ добиться этого.Однако, если в вашем DataTemplate есть только одна кнопка, это может быть немного проще:

Фактически вы можете обработать событие Click любой кнопки из хоста ListBox, например:

<ListBox Button.Click="removeButtonClick" ... />

Любые кнопки, содержащиеся в ListBox, будут вызывать это событие при нажатии на них.Из обработчика событий вы можете использовать e.OriginalSource, чтобы получить обратную ссылку на кнопку, на которую нажали.

Очевидно, что это слишком упрощенно, если у вашего ListBoxItems более одной кнопки, но во многих случаях это работает нормально.

Вы можете создать пользовательский элемент управления (.ascx) для размещения списка.Затем добавьте общедоступное событие для страницы.

Public Event btnRemove()

Затем в событии нажатия кнопки в пользовательском элементе управления

RaiseEvent btnRemove()

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top