0

誰かが私の問題の正しい道に私を導くことを願っています。

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>
4

1 に答える 1

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;

        }
    }
}

ソース: https://chandradev819.wordpress.com/2010/09/21/easiest-way-to-consume-wcf-service-and-fill-datagrid-from-database-in-silverlight/

于 2014-12-04T00:30:28.473 に答える