我如何使用DomainContext.Load来填充我的ViewModel的属性?

我有一个Silverlight页面,它从一个视图模型类获取数据,该类聚合了来自各种(RIA服务)域服务的一些数据。

理想情况下,我希望页面能够将其控件的数据绑定到视图模型对象的属性,但由于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的异步特性意味着当列表框数据绑定时,不必填充小部件列表。 (我的存储库中的一个断点表明要填充到集合中的代码正在执行,但仅在页面呈现之后。)

有人可以告诉我正确的做法吗?


这个难题的缺点是,当房产改变时我需要举办活动。

我更新的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");
            }
        }
    }
}

绑定到这些属性的控件会在属性更改事件触发时更新。

链接地址: http://www.djcxy.com/p/46395.html

上一篇: How do I use DomainContext.Load to populate properties of my ViewModel?

下一篇: Is a point inside or outside a polygon which is on the surface of a globe