Pergunta

Tenho um ListBox que possui um estilo definido para ListBoxItems.Dentro deste estilo, tenho alguns rótulos e um botão.Nesse botão, quero definir um evento de clique que possa ser manipulado na minha página (ou em qualquer página que use esse estilo).Como faço para criar um manipulador de eventos na minha página WPF para manipular o evento do meu estilo ListBoxItems?

Aqui está o meu estilo (apenas código afetado):

<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>

Obrigado!

Foi útil?

Solução

Dê uma olhada Comando RoteadoS.

Defina seu comando em myclass em algum lugar da seguinte forma:

    public static readonly RoutedCommand Login = new RoutedCommand();

Agora defina seu botão com este comando:

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

Você pode usar CommandParameter para obter informações extras.

Agora, por último, mas não menos importante, comece a ouvir seu comando:

No construtor da classe que você deseja fazer algumas coisas legais, você coloca:

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

ou em XAML:

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

E você implementa o delegado que o CommandBinding precisa:

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

Você pode começar a ouvir esse comando em qualquer lugar da sua árvore visual!

Espero que isto ajude

PS Você também pode definir o CommandBinding com um delegado CanExecute que irá até desabilitar seu comando se o CanExecute assim o indicar :)

PPS Aqui está outro exemplo: Comandos Roteados no WPF

Outras dicas

Como Arcturus postou, RoutedCommands são uma ótima maneira de conseguir isso.No entanto, se houver apenas um botão no seu DataTemplate, isso poderá ser um pouco mais simples:

Na verdade, você pode manipular o evento Click de qualquer botão no ListBox host, assim:

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

Quaisquer botões contidos no ListBox dispararão esse evento quando forem clicados.De dentro do manipulador de eventos, você pode usar e.OriginalSource para obter uma referência ao botão que foi clicado.

Obviamente, isso é muito simplista se seus ListBoxItems tiverem mais de um botão, mas em muitos casos funciona perfeitamente.

Você poderia criar um controle de usuário (.ascx) para abrigar a caixa de listagem.Em seguida, adicione um evento público para a página.

Public Event btnRemove()

Em seguida, no botão, clique no evento no usercontrol

RaiseEvent btnRemove()

Você também pode passar objetos pelo evento como qualquer outro método.Isso permitirá que seu controle de usuário diga à sua página o que excluir.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top