我希望有人能指导我找到解决问题的正确途径。
两年前,我在他的youtube频道关注了“MVF in WPF and Silverlight”中的Rainer Stropek series of videos。 他使用MVVM模型展示了非常明确的关注点分离。我已经完成了所有工作。
现在我的问题是当我要显示来自多个实体的数据时。例如。我有2张桌子(工作和状态)。
工作表 jobId,jobNo,jobDate,jobStatus =>(状态表的主键)
状态表 statusId,statusCaption
如果我想在datagird上显示所有作业并将jobStatus替换为其各自的statusCaption,我该如何编写ServiceContract和/或OperationContract以将此数据从wcf服务公开,以供ViewModel访问填充并更新数据网格。
更多细节
我在WCF中创建了一个方法“GetAllJobs”(用“OperationContract”修饰),它返回一个IEnumerable。如果我要从两个实体中选择字段,那么返回的Type将是匿名的。
[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>
答案 0 :(得分:0)
以下是一些我希望您会发现有用的代码:
namespace SilverlightApplication1
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
FillDataGrid();
}
private void FillDataGrid()
{
Service1Client client = new Service1Client();
client.GetAllEmpCompleted += new
EventHandler<GetAllEmpCompletedEventArgs>(client_GetAllEmpCompleted);
client.GetAllEmpAsync();
}
void client_GetAllEmpCompleted(object sender, GetAllEmpCompletedEventArgs e)
{
GridTest.ItemsSource = e.Result;
}
}
}