none
binding xaml con metodos asincronos (universal apps) RRS feed

  • Pregunta

  • hola

    tengo el problema de que los datos cargados en mi viewmodel no se reflejan en el xaml, pienso que debo estar haciendo algo mal en el tema del binding asociado a metodos asincronos, la idea es una pantalla que tiene un control Hub, en una de las seccions del hub  quiero mostrar un usercontrol, este control tiene asociada una viewModel la cual trae datos de un archivo sqlite, toda esta parte funciona muy bien ya q con el debuging verifique que se carguen los datos correctamente en las colecciones, el tema es q no se muestran en la pantalla:

    public class VMpuntosDeAtencion:VMBase
        {
            public VMpuntosDeAtencion() {}
     
            private ObservableCollection<CPuntoAtencion> _Puntos;
            public ObservableCollection<CPuntoAtencion> Puntos{
                get { return _Puntos; }
                set { _Puntos = value; RaisePropertyChanged("Puntos"); }
            }
     
            private CPuntoAtencion _PuntoSeleccionado;
            public CPuntoAtencion PuntoSeleccionado{
                get { return _PuntoSeleccionado; }
                set { _PuntoSeleccionado = value; RaisePropertyChanged("PuntoSeleccionado"); }
            }
     
            public async Task CargaPuntos()
            {
                Puntos = await BLL.clsPuntoAtencion.GetPuntos();
                PuntoSeleccionado = Puntos[0];
            }
        }

    la clase VMBase es asi:

    public class VMBase
        {
            public event PropertyChangedEventHandler PropertyChanged;
            protected virtual void RaisePropertyChanged(string propertyName){
                PropertyChangedEventHandler handler = this.PropertyChanged;
                if (handler != null)
                     handler(thisnew PropertyChangedEventArgs(propertyName));
     
            }
        }

    Mi xaml es asi

    <UserControl
        x:Class="CREMovil.UserControls.ucPuntosDeAtencion"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="using:CREMovil.UserControls"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:vm="using:CREMovil.ViewModels"
        mc:Ignorable="d"
        d:DesignHeight="300"
        d:DesignWidth="400" Loaded="UserControl_Loaded">
        <UserControl.DataContext>
            <vm:VMpuntosDeAtencion/>
        </UserControl.DataContext>
        <Grid>
            <TextBlock>test:</TextBlock>
            <TextBlock  Text="{Binding PuntoSeleccionado.Nombre,Mode=TwoWay}"/>
            <ListView Grid.Row="0" Grid.Column="1" SelectionMode="None"
                          Margin="10"ItemsSource="{Binding Puntos }">
                <ListView.HeaderTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal" >
                            
                            <TextBlock Width="80" Style="{StaticResource TitleTextBlockStyle}">Nombre</TextBlock>
                            <TextBlock Width="120" Style="{StaticResource TitleTextBlockStyle}">Dirección</TextBlock>
                            <TextBlock Width="120" Style="{StaticResource TitleTextBlockStyle}">Tipo</TextBlock>
                            <TextBlock Width="100" Style="{StaticResource TitleTextBlockStyle}">Ver en Mapa</TextBlock>
                        </StackPanel>
                    </DataTemplate>
                </ListView.HeaderTemplate>
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <StackPanel Orientation="Horizontal" >
                            <TextBlock Width="080" Text="{Binding Nombre}" Style="{StaticResource CaptionTextBlockStyle}"/>
                            <TextBlock Width="120" Text="{Binding Direccion}" Style="{StaticResource CaptionTextBlockStyle}"/>
                            <TextBlock Width="120" Text="{Binding Categoria}" Style="{StaticResource CaptionTextBlockStyle}"/>
                            <TextBlock Width="100" Text="{Binding }" Style="{StaticResource CaptionTextBlockStyle}"/>
                        </StackPanel>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </Grid>
    </UserControl>
    

    y mi codeBehind es:

    public sealed partial class ucPuntosDeAtencion : UserControl
        {
            public ucPuntosDeAtencion(){
                this.InitializeComponent();
            }
     
            private async  void UserControl_Loaded(object sender, RoutedEventArgs e)
            {
                VMpuntosDeAtencion VM = (VMpuntosDeAtencion)this.DataContext;
                await VM.CargaPuntos();
            }
        }

    no encuentro el error de porque el binding no se produce, algguna idea????

    muchas gracias


    Salu2 Sergio T

    jueves, 18 de junio de 2015 12:22

Todas las respuestas

  • Hola SergioT, primeramente te recomiendo que utilices comandos en tu ViewModel y crees uno que se llame Loaded o algo así. Entonces allí puedes llamar a tu método CargarPuntos().

    En tu caso, deberías eliminar tu código del UserControl_Loaded y luego hacer algo así en tu ViewModel:

    public VMpuntosDeAtencion()
    {
        Task.Run(async ()=>
            {
                await this.CargarPuntos();
            });
    }

    Espero resulte útil.

    Saludos.


    Christian Amado
    Software Engineer | MCPD: Windows Phone Developer | MCTS: Silverlight Developer
    Don't forget to mark the right answer and vote up if helps you.
    MCP Profile
    My code samples

    jueves, 18 de junio de 2015 13:40
  • Hola

    hice el cambio q me recomiendas, aumentando en el constructor del viewmodel la llamada Task.Run( async()=>{await this.CargaPuntos();}); y aun no funcionó, cuando uso el usercontrol.

    Peroo he hecho el experimento de eliminar el usercontrol y llevar el XAML a mi MainPage.xaml y llevar el codigo del viewmodel al viewmodel del mainPage y ahi si ya funcionó!!! Osea que debe haber algun problema en el manejo del  usercontrol,  estaba llamandolo asi:

    <HubSection IsHeaderInteractive="True" Header="Puntos de Atencion" Width="500">
                    <DataTemplate>
                        <uc:ucPuntosDeAtencion/>
    </DataTemplate>
    </HubSection>

    hay algo mas que hacer al iniciializar un usercontrol?  porque aparentemente es ahi el problma

    muchas gracias Christian !!!!


    Salu2 Sergio T


    • Editado SergioT jueves, 18 de junio de 2015 15:54
    jueves, 18 de junio de 2015 15:53