誰かが私の問題の正しい道に私を導くことを願っています。
2 年前、Rainer Stropek の youtube チャンネルで「WPF と Silverlight の MVVM」に関する一連のビデオをフォローしました。
彼は、MVVM モデルを使用して、関心事の非常に明確な分離を示しました。私はそれをすべて機能させました。
今私の問題は、複数のエンティティからのデータを表示する必要がある場合です。例えば。2 つのテーブル (ジョブとステータス) があります。
ジョブテーブル jobId, jobNo, jobDate, jobStatus =>(ステータステーブルの主キー)
ステータス テーブル statusId、statusCaption
すべてのジョブを datagird に表示し、jobStatus をそれぞれの statusCaption に置き換えたい場合、ServiceContract や OperationContract を記述して、このデータを wcf サービスから公開し、ViewModel がアクセスして入力および更新する方法を教えてください。データグリッド。
いくつかの詳細
IEnumerable を返す WCF ("OperationContract" で装飾) に "GetAllJobs" メソッドを作成しました。2 つのエンティティからフィールドを選択する場合、返される 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では、INotifyedPropertyChangedを実装するためのObjsプロパティと、ビューのデータグリッドを更新するための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>