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 -