33 messaggi dal 12 agosto 2009
Una finestra WPF, il cui accesso ai dati è basato sul pattern MVVM, quando si apre, resta bloccata finchè non siano pronti i dati che il DataGrid al suo interno va a caricare.

IN PRATICA LA DOMANDA E' COME CARICARE UN DATACONTEXT IN MODO ASINCRONO

Ho provato con un background worker, con un thread separato, ma resta comunque bloccata finchè non siano pronti a dati.
Quello che vorrei è che la finestra sia visualizzata comunque, e che il datagrid mostri le righe quando i dati sono pronti.



Qui il codice XAML

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:dm="clr-namespace:DataModel;assembly=DataModel"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:WpfApplication1="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="415" Width="646">
    <Window.DataContext>
        <dm:AccViewModel x:Name="AccVM" /> 
    </Window.DataContext>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="361*"></ColumnDefinition>
            <ColumnDefinition Width="263*"></ColumnDefinition>
        </Grid.ColumnDefinitions>
        <Grid Height="96" HorizontalAlignment="Left" Margin="6,0,0,0" Name="grid1" VerticalAlignment="Top" Width="606">
            <Image Height="76" HorizontalAlignment="Left" Margin="6,14,0,0" Name="image1" Stretch="Fill" VerticalAlignment="Top" Width="294" ImageFailed="image1_ImageFailed" Source="/WpfApplication1;component/Images/Logo.jpg" />
        </Grid>
        <DataGrid AutoGenerateColumns="False" 
                  Height="Auto" 
                  Width="Auto" 
                  HorizontalAlignment="Left" 
                  Margin="9,101,0,0" 
                  Name="dataGrid1" 
                  VerticalAlignment="Top" 
                  ItemsSource="{Binding Path=Referti}" SelectionChanged="dataGrid1_SelectionChanged"
                  IsSynchronizedWithCurrentItem="True">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Path=CodicePaziente}" CanUserReorder="False" CanUserResize="True" CanUserSort="True" Header="Id Paziente" IsReadOnly="True" />
                <DataGridTextColumn Binding="{Binding Path=CodiceAccettazione}" CanUserReorder="False" CanUserResize="True" CanUserSort="True" Header="Numeto Accettazione" IsReadOnly="True" />
                <DataGridTextColumn Binding="{Binding Path=Laboratorio}" CanUserReorder="False" CanUserResize="True" CanUserSort="True" Header="Laboratorio" IsReadOnly="True" />
                <DataGridTextColumn Binding="{Binding Path=Nominativo}" CanUserReorder="False" CanUserResize="True" CanUserSort="True" Header="Nominativo" IsReadOnly="True" />
                <DataGridTextColumn Binding="{Binding Path=DataDiNascita}" CanUserReorder="False" CanUserResize="True" CanUserSort="True" Header="Data di Nascita" IsReadOnly="True" />
                <DataGridTextColumn Binding="{Binding Path=Sesso}" CanUserReorder="False" CanUserResize="True" CanUserSort="False" Header="Sesso" IsReadOnly="True" />
                <DataGridTextColumn Binding="{Binding Path=DateFileUpdated}" CanUserReorder="False" CanUserResize="True" CanUserSort="True" Header="Data" IsReadOnly="True" />
            </DataGrid.Columns>
        </DataGrid>
        <WpfApplication1:AcceptCtrl Grid.Column="1" x:Name="AcceptCtrl1" DataContext="{Binding Path=SelectedReferto, UpdateSourceTrigger=PropertyChanged, Mode=OneWay, NotifyOnTargetUpdated=True, NotifyOnSourceUpdated=True}"></WpfApplication1:AcceptCtrl>
    </Grid>
</Window>



Qui la classe accViewModel che sovrintende all'estrazione dei sati.

public class AccViewModel: ViewModel
    {
        public Referti Referti { get; set; }

        public Referto _selectedReferto = null;


        //private BackgroundWorker bw = new BackgroundWorker();

        //public BackgroundWorker BackGroundWorker
        //{
        //    get { return bw; }
        //    set { bw = value; }
        //}

        public Referto SelectedReferto
        {
            get { return _selectedReferto; }
            set
            {
                _selectedReferto = value;
                NotifyPropertyChanged("SelectedReferto");
            }
        }

        private static System.Windows.Threading.Dispatcher _dispatcher = null;
        public static System.Windows.Threading.Dispatcher Dispatchet
        {
            get { return _dispatcher; } 
            set { _dispatcher = value; }
        }


        private delegate void Datadelegate();
        System.Threading.Thread tx;
        public delegate void updateData();
        updateData d;


        public AccViewModel()
        {
            //Codice per il BAckGroundWorker
            //bw.WorkerReportsProgress = true;
            //bw.WorkerSupportsCancellation = true;
            //bw.DoWork += new DoWorkEventHandler(bw_DoWork);
            //bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
            //bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);

            Referti = new Referti();
            SelectedReferto = null;
             //Semplice
            //RetrieveData();

             //Thread
            //ThreadStart start = () => Dispatchet.BeginInvoke(DispatcherPriority.Normal,
            //                                                    new Action(RetrieveData));
            //new Thread(start).Start();

             //altro sistema
            d = new updateData(RetrieveData);
            tx = new System.Threading.Thread(RetrieveDataThread);
            tx.Start();

            //bw.RunWorkerAsync();
            //Action a =
            //    () => RetrieveData();
            //Dispatchet.BeginInvoke(a,new object[]{});
            //RetrieveData();
        }

        //private void bw_DoWork(object sender, DoWorkEventArgs e)
        //{
        //    BackgroundWorker worker = sender as BackgroundWorker;
        //    System.Windows.Threading.Dispatcher dispatcher = System.Windows.Threading.Dispatcher.CurrentDispatcher;
        //    Action a =
        //        () => RetrieveData();
        //    Dispatchet.BeginInvoke(a, new object[] { });

            
        //}


        //private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        //{
        //    if ((e.Cancelled == true))
        //    {
        //        ;
        //    }

        //    else if (!(e.Error == null))
        //    {
        //        ;
        //    }

        //    else
        //    {
        //        ;
        //    }
        //}

        //private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
        //{
            
        //}

        private static bool _received = false;
        public static bool Received
        {
            get { return _received; }
        }

        private void RetrieveDataThread()
        {
            Dispatchet.BeginInvoke(d, null);
        }

        private void RetrieveData()
        {
            if (_received)
            {
                _received = !_received;
                return;
            }
            _received = !_received;

            try
            {
                //System.Threading.Thread.Sleep(5000);
                Referti = Referti.GetReferti(Configuration.DataFolder, Referti);
                base.NotifyPropertyChanged("Referti");
            } catch (Exception ex)
            {
                ;
            }
        }
    }

Modificato da eomer1975 il 11 gennaio 2012 10.15 -
la prima domanda che mi viene è : quanti dati visualizzi? perche considera che se sono molti il ritardo non è facilmente eliminabile

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
33 messaggi dal 12 agosto 2009
Può durare anche 30 secondi, se ci sono molti dati, a causa a volte della lentezza della rete

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
Community
Ultimi messaggi
UTENTI ONLINE
In primo piano

I più letti di oggi

Media
In evidenza
MISC