none
Recuperar UserControl de um ListBox.DataTemplate (WPF) RRS feed

  • Pergunta

  •  

     

    Boa tarde a todos, estou com um pequeno problema e desde já agradeço a quem puder ajudar,

    tenho uma aplicação em WPF (desktop), em um user control tenho alguns componentes como dois labels e um button...

    apliquei este user control como ItemTemplate para um ListBox, dessa forma aparecem resultados de acordo com o meu ItemSource no code-behind...

    até ai tudo bem...

    agora sim o problema, este botão do user control que mencionei não tem evento algum, gostaria de saber se é possível eu atribuir este evento dinamicamente localizando esse usercontrol... dessa forma eu poderia recuperar informações que estão no ItemSource e também executar este evendt no Click do botão

    codigo da chamada do user control no listBox...
    <ListBox x:Name="lstServers" Margin="8,31,8,204" SourceUpdated="lstServers_SourceUpdated">
        <ListBox.ItemTemplate>
            <DataTemplate>
              <local:ucItemSincronizacao d:LayoutOverrides="Height" Width="538"/>
            </DataTemplate>
         </ListBox.ItemTemplate>
    </ListBox>
    
    
    //--------------  UserControl adicionado no ListBox<br/>
    <UserControl
    	xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    	xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    	xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    	xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    	mc:Ignorable="d"
    	x:Class="Kderno_Client.FORMULARIO.USRCTRL_CAIO.ucItemSincronizacao"
    	x:Name="UserControl"
    	d:DesignWidth="640" Width="500" Height="65">
    
    	<Grid x:Name="LayoutRoot">
    		<Border BorderBrush="Black" BorderThickness="1" CornerRadius="5">
    			<Grid>
            <Image x:Name="imgServer" HorizontalAlignment="Left" Margin="36,0,0,0" Width="48" Source="../../../Images/1288050849_server.png"/>
    				<Label x:Name="lbNomeServidor" HorizontalAlignment="Left" Content="{Binding DESCRICAO}" Margin="88,13,0,13.04" Width="225"/>
    				<Button x:Name="btSincronizar" HorizontalAlignment="Right" Width="75" Content="Sincronizar" Margin="0,13,91,13.04" d:LayoutOverrides="Height" />
    				<Button x:Name="btVerificar" HorizontalAlignment="Right" Width="75" Content="Verificar" Margin="0,13,8,13.04" d:LayoutOverrides="Height"/>
            <Image x:Name="imgStatusServer" HorizontalAlignment="Left" Width="24" Height="24" Margin="8,19.96,0,19.04" Source="../../../Images/1288051504_accepted_48.png"/>
    			</Grid>
    		</Border>
    	</Grid>
    </UserControl>
    

    Muito obrigado a todos!

    terça-feira, 2 de novembro de 2010 18:26

Respostas

  • Você poderia criar um evento no UserControl e atribuir ele no template, mas acredito que o melhor a fazer é colocar o evento Click do botão no próprio UserControl. Como o DataContext do UserControl é o elemento do item, você tem acesso a ele no prório UserControl

    []s

    Bruno

     


    MVP Client Development - http://msmvps.com/blogs/bsonnino
    • Marcado como Resposta Lucas Bertin quarta-feira, 3 de novembro de 2010 03:18
    terça-feira, 2 de novembro de 2010 19:41

Todas as Respostas

  • Você poderia criar um evento no UserControl e atribuir ele no template, mas acredito que o melhor a fazer é colocar o evento Click do botão no próprio UserControl. Como o DataContext do UserControl é o elemento do item, você tem acesso a ele no prório UserControl

    []s

    Bruno

     


    MVP Client Development - http://msmvps.com/blogs/bsonnino
    • Marcado como Resposta Lucas Bertin quarta-feira, 3 de novembro de 2010 03:18
    terça-feira, 2 de novembro de 2010 19:41
  • Olá Bruno, obrigado por responder, então cara, mas como eu poderia acessar o UserControl de dentro do ListBox? 

    pergunto em termos de codificação mesmo... tentei algumas formas que procurei no google mas nada feito...

    Não estou com o fonte no momento, mas me lembro de ter passado pelo DataContext de dentro do listbox e ele estava Null... 

    se eu implementar o evento click no UserControl, como poderia recuperar informações inseridas no ItemSource do ListBox? Eu não consigo não é? Ou se eu utilizar Binding estárá em algum componente ?

    Assim que puder testar posto se encontrei uma solução, 

    Obrigado Bruno!

    []'s

    quarta-feira, 3 de novembro de 2010 00:24
  • Cara, consegui fazer o que eu queria... fiz o que vc indicou...

    primeiro criei o evento no próprio user control, depois peguei pelo DataContext o Id que eu precisava

    Criei um evento de dentro do usercontrol, usando o EventManager registrei o cara e fiz o pai chamar esse evento passando o ID capturado

    depois disso foi fácil continuar a chamar os métodos de antes

    para quem quiser o codigo de exemplo de como registrei o evento, é isto aqui

     

    public partial class ucItemSincronizacao : UserControl
    	{<br/>
                public ucItemSincronizacao()<br/>
                {<br/>
                   this.InitializeComponent();                                   
    
     //usei este if peli simples fato de quando uso ele repedidamente no contexto de listbox, já existe uma instancia de SyncDownEvent registrada<br/>
                if (SyncDownEvent == null)
          {
           SyncDownEvent = EventManager.RegisterRoutedEvent("SyncDown", RoutingStrategy.Bubble,
             typeof(RoutedEventHandler), typeof(ucItemSincronizacao));
          }
    	}
    
    
        private void btSincronizar_Click(object sender, RoutedEventArgs e)
        {
         int id = ((ClasseUsada)this.DataContext).ID;
         OnKSyncDown(id);
        }
    
        public static RoutedEvent SyncDownEvent;
        public event RoutedEventHandler SyncDown
        {
         add { AddHandler(SyncDownEvent, value); }
         remove { RemoveHandler(SyncDownEvent, value); }
        }
        protected virtual void OnKSyncDown(int Id)
        {
          RoutedEventArgs args = new RoutedEventArgs();
          args.RoutedEvent = SyncDownEvent;
          args.Source = Id;
          RaiseEvent(args);
        }<br/>
    }
    

    Muito obrigado!

    []'s

     

    quarta-feira, 3 de novembro de 2010 03:18