none
PROBLEMA.....Como accerder a un Combobox dentro de un DataTemplate ? RRS feed

  • Pregunta

  • Hola Amigos, perdoneme por la repeticion de la pregunta, es que no se que ocurre que no puedo visionarla la anterior que he puesto con el mismo nombre, por eso la he vuelto a insertar, esta es mi duda.

    Tengo unos datos para pasarle al combobox, todo funciona perfecto si esta fuera del datatemplate del archivo xaml y el nombre del combobox me aparece sin problemas, pero cuando lo inserto dentro del datatemplate yo no se encuentra dentro del espacio de nombres, como puedo pasarle los datos a un combobox ( u otro elemento cono los textbox ) cuando se encuentran dentro de un datatemplate del archivo xaml.
    lunes, 8 de marzo de 2010 8:58

Respuestas

  • Hola WpfSoft.

    En el link que te he puesto tienes una forma manual de poder hacerlo.

    No obstante como veo que solo lo quieres para popular los datos, puede que esta forma te sea mas util:

    1.- en el codigo xaml, buscas el combobox y le añades el evento "Loaded", como en la siguiente linea:

    <ComboBox Name="comboUsuarios" Loaded="comboUsuarios_Loaded" ItemsSource="{Binding}" VerticalAlignment="Top" Height="20">

    luego en el codigo c# controlas el evento del control cargado, como por ejemplo:

            private void comboUsuarios_Loaded(object sender, RoutedEventArgs e)
            {
                ComboBox combo = (ComboBox)e.OriginalSource;
    
                combo.DataContext = datos.Tables[0].DefaultView;
            }

    Este evento sera llamado cada vez que sea creado un combo (una vez por linea del listView).
    De modo que aqui puedes inicializar los combos.

    Tambien puedes hacer uso de otros eventos o bindings, incluso te puedes crear un array e ir guardandote las referencias si quieres acceder luego a ellos.

    Ya me diras que tal.



    Saludos
    David González
    martes, 9 de marzo de 2010 13:12

Todas las respuestas

  • Hola WpfSoft.

    en este post, tratamos algo similar:


    Si puedes postear el codigo para ver donde tienes el datatemplate podemos buscar otras soluciones.

    Saludos
    David González
    lunes, 8 de marzo de 2010 12:41
  • Hola David , el problema es que no me aparecen los nombres de los elementos que estan dentro de un datatemplate, por ejemplo el combobox con nombre comboUsuarios, aqui te paso el codigo, perdonen por tango spagetti code pero es que estoy aprendiendo esto de wpf y me encanta.

    <UserControl x:Class="Eva1.usuario"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="400" Width="800">
    
    
        <Grid x:Name="Grid1">
            <StackPanel Orientation="Horizontal" Margin="5">
                <StackPanel Width="40" Background="DarkBlue" Height="20" HorizontalAlignment="Left" Margin="7.5,4,0,0" VerticalAlignment="Top">
                    <TextBlock FontSize="12" Height="20" Width="40" Foreground="White" TextAlignment="Center">ID</TextBlock>
                </StackPanel>
                <StackPanel Width="90" Background="DarkBlue" Height="20" HorizontalAlignment="Left" Margin="0,4,0,0" VerticalAlignment="Top">
                    <TextBlock FontSize="12" Height="20" Width="90" Foreground="White" TextAlignment="Center">USUARIO</TextBlock>
                </StackPanel>
                <StackPanel Width="90" Background="DarkBlue" Height="20" HorizontalAlignment="Left" Margin="0,4,0,0" VerticalAlignment="Top">
                    <TextBlock FontSize="12" Height="20" Width="90" Foreground="White" TextAlignment="Center">PASSWORD</TextBlock>
                </StackPanel>
                <StackPanel Width="90" Background="DarkBlue" Height="20" HorizontalAlignment="Left" Margin="0,4,0,0" VerticalAlignment="Top">
                    <TextBlock FontSize="12" Height="20" Width="90" Foreground="White" TextAlignment="Center">NOMBRE</TextBlock>
                </StackPanel>
                <StackPanel Width="90" Background="DarkBlue" Height="20" HorizontalAlignment="Left" Margin="0,4,0,0" VerticalAlignment="Top">
                    <TextBlock FontSize="12" Height="20" Width="90" Foreground="White" TextAlignment="Center">APELLIDOS</TextBlock>
                </StackPanel>
     
    
            </StackPanel>
    
    
            <ListView Margin="12,28,186.25,40" Name="ListadoUsuarios"  ItemsSource="{Binding Path=Table}" Background="Lavender" LostFocus="StackPanel_LostFocus" MouseDoubleClick="actualizarUsuarioRaton">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal" Margin="5">
    
                            <StackPanel Margin="2" Width="20">
                                <TextBox Name="idListadoVista" FontWeight="Bold" FontSize="12" Text="{Binding Path=id}"/>
                            </StackPanel>
                            <StackPanel Margin="2" Width="100">
                                <TextBox Name="usuarioListadoVista" FontWeight="Bold" FontSize="12" Text="{Binding Path=usuario}"/>
                            </StackPanel>
                            <StackPanel Margin="2" Width="100">
                                <TextBox Name="passwordListadoVista" FontWeight="Bold" FontSize="12" Text="{Binding Path=password}"/>
                            </StackPanel>
                            <StackPanel Margin="2" Width="100">
                                <TextBox Name="nombreListadoVista" FontWeight="Bold" FontSize="12" Text="{Binding Path=nombre}"/>
                            </StackPanel>
                            <StackPanel Margin="2" Width="100">
                                <TextBox Name="apellidosListadoVista" FontWeight="Bold" FontSize="12" Text="{Binding Path=apellidos}"/>
                            </StackPanel>
                            <StackPanel>
                                <ComboBox Name="comboUsuarios" ItemsSource="{Binding}" VerticalAlignment="Top" Height="20">
                                    <ComboBox.ItemTemplate>
                                        <DataTemplate>
                                            <StackPanel Orientation="Horizontal">
                                                <TextBlock Text="{Binding id}" Width="50" />
                                                <TextBlock Text="{Binding usuario}" Width="100" />
                                            </StackPanel>
                                        </DataTemplate>
                                    </ComboBox.ItemTemplate>
                                </ComboBox>
                               </StackPanel>
                           </StackPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </Grid>
    </UserControl>
    Y este es su codigo c#

                Modelos.Clase_Usuarios controladorVista = new Eva1.Modelos.Clase_Usuarios();
                controladorVista.mostrarUsuarios();
                SqlDataAdapter adaptador = new SqlDataAdapter();
                adaptador = controladorVista.getconsultaUsuariosDA();
                DataSet datos = new DataSet();
                adaptador.Fill(datos, "Usuarios");
                ListadoUsuarios.DataContext = datos.Tables[0].DefaultView;
                
                controladorVista.mostrarComboUsuarios();
                adaptador = controladorVista.getconsultaUsuariosDA();
                DataSet datosCB = new DataSet();
                adaptador.Fill(datosCB);
    // Aqui ya me da error por que no reconoce el nombre del combobox
    comboUsuarios.DataContext = datos.Tables[0].DefaultView;
    controladorVista.cerrarConexion();
    Saludos y muchas gracias.
    lunes, 8 de marzo de 2010 15:12
  • Hola WpfSoft.

    En el link que te he puesto tienes una forma manual de poder hacerlo.

    No obstante como veo que solo lo quieres para popular los datos, puede que esta forma te sea mas util:

    1.- en el codigo xaml, buscas el combobox y le añades el evento "Loaded", como en la siguiente linea:

    <ComboBox Name="comboUsuarios" Loaded="comboUsuarios_Loaded" ItemsSource="{Binding}" VerticalAlignment="Top" Height="20">

    luego en el codigo c# controlas el evento del control cargado, como por ejemplo:

            private void comboUsuarios_Loaded(object sender, RoutedEventArgs e)
            {
                ComboBox combo = (ComboBox)e.OriginalSource;
    
                combo.DataContext = datos.Tables[0].DefaultView;
            }

    Este evento sera llamado cada vez que sea creado un combo (una vez por linea del listView).
    De modo que aqui puedes inicializar los combos.

    Tambien puedes hacer uso de otros eventos o bindings, incluso te puedes crear un array e ir guardandote las referencias si quieres acceder luego a ellos.

    Ya me diras que tal.



    Saludos
    David González
    martes, 9 de marzo de 2010 13:12