Стиль окна списка WPF с кнопкой

У меня есть 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>

Спасибо!


person ScottG    schedule 26.08.2008    source источник


Ответы (3)


Взгляните на RoutedCommand.

Определите свою команду в 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

person Arcturus    schedule 26.08.2008

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

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

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

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

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

person Matt Hamilton    schedule 10.10.2008

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

Public Event btnRemove()

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

RaiseEvent btnRemove()

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

person Jas    schedule 26.08.2008