【发布时间】:2011-08-29 17:28:44
【问题描述】:
我在使用 RIA 服务和实体的 Silverlight 4 应用程序中遇到一些基本的 MVVM 设计原则。这是似乎可以正常工作的基本方案:
DataViewModel.cs
public DataViewModel : NotificationObject
private DataDomainContext _dataContext;
public DataViewModel()
{
_dataContext = new DataDomainContext();
if (!DesignerProperties.IsInDesignTool)
{
Data = _dataContext.Data;
dataContext.Load(_dataContext.GetDataQuery(), null, null);
}
}
private IEnumerable<DataEntity> _data;
public IEnumerable<DataEntity> Data // INPC property
{
get { return _data; }
set
{
if (value != _data)
{
_data = value;
PropertyChanged(this, new PropertyChangedEventArgs("Data"));
}
}
}
}
在我看来,DataGrid 单向绑定到 DataViewModel.Data,DataDomainContext 是在为 DataEntity 对象编译域服务后公开的 RIA 域上下文。
我想将视图模型与 DAL 分离。我想要一个 DataService 类,它会负责向域上下文询问数据:
public DataViewModel : NotificationObject
private DataService _dataService;
public DataViewModel(DataService dataService)
{
_dataService = dataService;
if (!DesignerProperties.IsInDesignTool)
{
Data = _dataService.Data;
_dataService.GetData();
}
}
...
}
但是,我似乎无法做到这一点。这很容易做到吗?我之前没有设计过带有回调的数据服务。我尝试通过 INPC 跨三个类链接数据属性,但 UI 中的 DataGrid 出现空白。我还想转换为新类型 DataDto 的集合,因此我的表示层不与后端耦合。我没有运气就尝试过这样的事情:
DataService.cs
public DataService : INotifyPropertyChanged
{
public DataService()
{
_dataContext = new DataDomainContext();
}
public event PropertyChangedEventHandler PropertyChanged;
public void GetData()
{
DataEntities = _domainContext.Data;
_dataContext.Load(_dataContext.GetDataQuery(), FinishedLoading, null);
}
private void FinishedLoading(...)
{
Data = DataEntities.Select(de => new DataDto(de));
}
public IEnumerable<DataDto> Data { ... } // INPC property, used for binding in ViewModel
public IEnumerable<DataEntity> DataEntities { ... } // INPC property
...
}
我在这里走对了吗?我是否遗漏了任何高层次的东西,或者我只是没有正确的细节?
编辑:
我最终能够弄清楚这一点。答案涉及通过 Action 将回调传递给数据服务/存储库调用。调用的返回类型实际上是 void,并且使用事件参数来传递结果。如果有人感兴趣,我很乐意发布一些工作代码,只需在 cmets 中留下请求即可。
【问题讨论】:
-
嗨,克里斯,您应该继续发布结果,它将帮助将来找到此结果的人。如您所见,在 Silverlight 中按要求异步完成时,数据服务层完全不同。听起来您找到了正确的解决方案:-)
标签: c# silverlight entity-framework mvvm ria