none
LINQ - Problema enlazando Listbox RRS feed

  • Pregunta

  • Buenas:

    Tengo un problema enlazando 1 listbox con campos de 2 tablas distintas. Estas 2 tablas están relacionadas.

    XAML

        <UserControl.Resources>    

            <DataTemplate x:Key="tmplPed">
                <StackPanel Margin="0">
                    <TextBlock Text="{Binding pedido
                                           Tag="{Binding idPed
                                           Margin="0,0,0,0"
                                           FontSize="{StaticResource PhoneFontSizeExtraLarge}"
                                           FontFamily="{StaticResource PhoneFontFamilySemiLight}"/>
                    <TextBlock Text="{Binding tipo}"
                                           Margin="0,0,0,0"
                                           Foreground="{StaticResource PhoneSubtleBrush}"
                                           FontSize="{StaticResource PhoneFontSizeNormal}"/>
                    <TextBlock Text="{Binding estado}"
                                           Margin="0,0,0,0"
                                           Foreground="{StaticResource PhoneSubtleBrush}"
                                           FontSize="{StaticResource PhoneFontSizeNormal}"
                                           FontFamily="{StaticResource PhoneFontFamilySemiBold}" />
                </StackPanel>
            </DataTemplate>       

        </UserControl.Resources>

    (....)

     <ListBox Name="LstPed" ItemTemplate="{StaticResource tmplPed}" Margin="8"/>     


    C#

                        var _lst = from p in miDataContext.pedidos
                                         join t in miDataContext.tipos on p.idTipo equals t.idTipo
                                         orderby p.pedido
                                         where p.idCliente == _idCli
                                         select new
                                         {
                                             pedido = p.pedido
                                             estado = p.estado,
                                             idPed= p.idPed
                                             tipo = t.tipo
                                         };

    LstPed.ItemsSource = _lst.ToList();

    Pero el listbox no me está mostrando nada.

    Pero _lst sí contiene los datos. Ya que si hago lo siguiente, me muestra de forma correcta los datos mediante msg,.

                        foreach (var xxx in _lst)
                        {
                            MessageBox.Show(xxx.pedido);
                            MessageBox.Show(xxx.tipo);
                            MessageBox.Show(xxx.estado);
                        }

    Si también pruebo de hacer la consulta básica (1 sola tabla) entonces el listbox sí muestra los datos.

                        var _lst = from p in miDataContext.pedidos                                     
                                         orderby p.pedido
                                         where p.idCliente == _idCli
                                         select p

    Por lo que no sé que estoy haciendo mal.

    Gracias de antemano

                          

    Saludos / Regards

    sábado, 3 de marzo de 2012 19:55

Respuestas

  • Hola yaeko.m

    Perdona, no me di cuenta de que necesitabas devolver un tipo anónimo porque los campos eran una union de tus dos clases :)

    El InternalsVisibleTo es perfecto, con eso puedes enlazar a tipos anónimos pero está bien acotado, solo permitiendo que System.Windows acceda a ellos. No le veo ningún problema a usarlo.

    Un saludo!


    MCTS - .NET 4.0 Windows Applications
    MCTS - .NET 4.0 Data Access
    MCTS - .NET 4.0 Service Communication Applications
    MCPD - .NET 4.0 Windows Developer
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter

    • Marcado como respuesta yaeko.m lunes, 5 de marzo de 2012 10:33
    lunes, 5 de marzo de 2012 6:43
    Moderador

Todas las respuestas

  • Hola!

    En el primer linQ, estás devolviendo un tipo anónimo al hacer select new { ... }, prueba a hacer select new PEDIDO { ... } siendo PEDIDO el nombre de tu clase de pedido.

    Un saludo!


    MCTS - .NET 4.0 Windows Applications
    MCTS - .NET 4.0 Data Access
    MCTS - .NET 4.0 Service Communication Applications
    MCPD - .NET 4.0 Windows Developer
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter

    domingo, 4 de marzo de 2012 6:35
    Moderador
  • Hola Yeray:

    gracias por responder.

    He probado lo que me comentas, pero entonces me marca error de que "pedidos" no contiene una definición para  "tipo".

    Luego he probado otra cosa (q he encontrado en un foro) y va relacionado con lo que me has dicho tú (lo de tipo anónimo).

    He añadido esto en AssemblyInfo.cs :

    [assembly: System.Runtime.CompilerServices.InternalsVisibleTo("System.Windows")]

    y entonces sí funciona, .....pero no sé si es lo más correcto hacer eso....Por lo que si hubiera otra solución....


    Saludos / Regards

    domingo, 4 de marzo de 2012 15:42
  • Hola yaeko.m

    Perdona, no me di cuenta de que necesitabas devolver un tipo anónimo porque los campos eran una union de tus dos clases :)

    El InternalsVisibleTo es perfecto, con eso puedes enlazar a tipos anónimos pero está bien acotado, solo permitiendo que System.Windows acceda a ellos. No le veo ningún problema a usarlo.

    Un saludo!


    MCTS - .NET 4.0 Windows Applications
    MCTS - .NET 4.0 Data Access
    MCTS - .NET 4.0 Service Communication Applications
    MCPD - .NET 4.0 Windows Developer
    Visita mi Blog en Geeks.ms
    Sigueme en Twitter

    • Marcado como respuesta yaeko.m lunes, 5 de marzo de 2012 10:33
    lunes, 5 de marzo de 2012 6:43
    Moderador
  • Ok Gracias por tu opinión! :)

    Saludos / Regards

    lunes, 5 de marzo de 2012 10:33