7

Ho una pagina Silverlight che riceve i dati da una classe del modello di vista che aggrega alcuni dati da vari servizi di dominio (servizi RIA).Come utilizzare DomainContext.Load per popolare le proprietà del mio ViewModel?

Idealmente mi piacerebbe che la pagina fosse in grado di associare i suoi dati ai controlli delle proprietà dell'oggetto modello di visualizzazione, ma poiché DomainContext.Load esegue una query in modo asincrono, i dati non sono disponibili al caricamento della pagina.

mia pagina di Silverlight ha il seguente XAML:

<navigation:Page x:Class="Demo.UI.Pages.WidgetPage" 
       // the usual xmlns stuff here... 
       xmlns:local="clr-namespace:Demo.UI.Pages" mc:Ignorable="d" 
       xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 

       d:DataContext="{d:DesignInstance Type=local:WidgetPageModel, IsDesignTimeCreatable=False}" 

       d:DesignWidth="640" d:DesignHeight="480" 
       Title="Widget Page"> 
     <Canvas x:Name="LayoutRoot"> 
      <ListBox ItemsSource="{Binding RedWidgets}" Width="150" Height="500" /> 
     </Canvas> 
    </navigation:Page> 

mio ViewModel si presenta così:

public class WidgetPageModel 
{ 
    private WidgetDomainContext WidgetContext { get; set; } 

    public WidgetPageModel() 
    {   
     this.WidgetContext = new WidgetDomainContext(); 

     WidgetContext.Load(WidgetContext.GetAllWidgetsQuery(), false);    

    } 

    public IEnumerable<Widget> RedWidgets 
    { 
     get 
     { 
      return this.WidgetContext.Widgets.Where(w => w.Colour == "Red"); 
     } 
    } 
} 

Penso che questo approccio deve essere fondamentalmente sbagliato perché la natura asincrona di Load significa che il widget la lista non è necessariamente popolata quando i dati ListBox si legano. (Un punto di interruzione nel mio repository mostra che il codice da popolare alla raccolta è in esecuzione, ma solo dopo il rendering della pagina.)

Qualcuno può indicarmi il modo giusto per farlo?

risposta

4

Il pezzo mancante del puzzle è che avevo bisogno di sollevare eventi quando le proprietà sono cambiate.

mio aggiornata ViewModel è la seguente:

public class WidgetPageModel : INotifyPropertyChanged 
{ 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void RaisePropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    private WidgetDomainContext WidgetContext { get; set; } 

    public WidgetPageModel() 
    {   
     this.WidgetContext = new WidgetDomainContext(); 

     WidgetContext.Load(WidgetContext.GetAllWidgetsQuery(), 
      (result) => 
      { 
       this.RedWidgets = this.WidgetContext.Widgets.Where(w => w.Colour == "Red"); 
      }, null);    

    } 

    private IEnumerable<Widget> _redWidgets; 
    public IEnumerable<Widget> RedWidgets 
    { 
     get 
     { 
      return _redWidgets; 
     } 
     set 
     { 
      if(value != _redWidgets) 
      { 
       _redWidgets = value; 
       RaisePropertyChanged("RedWidgets"); 
      } 
     } 
    } 
} 

I controlli associati a queste proprietà vengono aggiornati quando viene generato l'evento di cambio di proprietà.

Problemi correlati