我希望有人能指导我解决我的问题。
两年前,我在 Rainer Stropek 的 youtube 频道上关注了一系列关于“WPF 和 Silverlight 中的 MVVM”的视频。
他使用 MVVM 模型展示了非常清晰的关注点分离。我已经搞定了。
现在我的问题是当我必须显示来自多个实体的数据时。例如。我有 2 个表(工作和状态)。
工作表 jobId, jobNo, jobDate, jobStatus =>(状态表的主键)
状态表 statusId、statusCaption
如果我想在 datagird 上显示所有作业并用其各自的 statusCaption 替换 jobStatus,我该如何编写 ServiceContract 和/或 OperationContract 以从 wcf 服务公开这些数据以供 ViewModel 访问以填充和更新数据网格。
更多细节
我在 WCF 中创建了一个方法“GetAllJobs”(用“OperationContract”装饰),它返回一个 IEnumerable。这是因为如果我要从两个实体中选择字段,则返回的类型将是匿名的。
[OperationContract]
public IEnumerable<Object> GetAllJobs()
{
using (var context = new logisticDBEntities())
{
var result = context.Jobs
.Select(job => new{
j = job,
jobStatus = job.Status.statusCaption}).ToList();
return result;
}
在我的 ViewModel 上,我创建了一个 Objs 属性来实现 INotifyedPropertyChanged 以及一个 refreshAllJobs 方法来更新视图上的数据网格
private PMServiceClient serviceClient =
new PMServiceClient();
public MaintenanceFormViewModel()
{
this.RefreshAllJobs();
}
private IEnumerable<Job> jobs;
public IEnumerable<Job> Jobs
{
get
{
return this.jobs;
}
set
{
this.jobs = value;
OnPropertyChanged("Jobs");
}
}
private void RefreshAllJobs()
{
this.serviceClient.GetAllJobsCompleted += (s, e) =>
{
this.Objs = e.Result;
};
this.serviceClient.GetAllJobsAsync();
}
private void OnPropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
在视图上,我将 DataGrid 绑定到相应的属性
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Path=Objs}" Margin="10,10,6,6">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=jobNo}" Header="Job #" />
<DataGridTextColumn Binding="{Binding Path=statusCaption}" Header="Status" />
<DataGridTextColumn Binding="{Binding Path=jobDate}" Header="Date" />
</DataGrid.Columns>
</DataGrid>