7

У меня есть страница Silverlight, которая получает свои данные из класса модели представления, который объединяет некоторые данные из различных сервисов домена службы RIA.Как использовать DomainContext.Load для заполнения свойств моего ViewModel?

В идеале, я хотел бы, чтобы страница могла привязывать свои элементы управления к свойствам объекта модели представления, но поскольку DomainContext.Load выполняет асинхронный запрос, данные недоступны, когда страница загружается.

Моего Silverlight страница имеет следующий 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> 

Мой ViewModel выглядит следующим образом:

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"); 
     } 
    } 
} 

Я думаю, что этот подход должен быть в корне неверно, так как асинхронная природа Load означает, что виджет список не обязательно заполняется при связывании данных ListBox. (Точка останова в моем репозитории показывает, что код для заполнения в коллекции выполняется, но только после того, как отображается страница.)

Может кто-нибудь, пожалуйста, покажет мне правильный способ сделать это?

ответ

4

Недостающая часть головоломки заключается в том, что мне нужно было создавать события, когда свойства менялись.

Мой обновленный ViewModel выглядит следующим образом:

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"); 
      } 
     } 
    } 
} 

Элементы управления, связанные с этими свойствами обновляется, когда вызывается событие изменения свойства.

 Смежные вопросы

  • Нет связанных вопросов^_^