kri*_*ian 7 silverlight mvvm viewmodel silverlight-4.0 wcf-ria-services
我有一个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>
Run Code Online (Sandbox Code Playgroud)
我的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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
我认为这种方法必须是根本错误的,因为异步性质Load
意味着当ListBox数据绑定时,小部件列表不一定被填充.(我的存储库中的断点显示正在执行填充到集合的代码,但仅在页面呈现之后.)
有人可以告诉我正确的方法吗?
难题中缺少的一部分是我需要在属性更改时引发事件。
我更新后的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");
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
当属性更改事件触发时,绑定到这些属性的控件将被更新。
归档时间: |
|
查看次数: |
3592 次 |
最近记录: |