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> 

我的视图模型是这样的:

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

的缺少一块拼图的是,我需要进行筹款活动时的属性变化。

我更新视图模型如下:

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

势必给这些属性的控件的属性更改事件触发时更新。

相关问题