0

我希望有人能指导我解决我的问题。

两年前,我在 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>
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/easyest-way-to-consume-wcf-service-and-fill-datagrid-from-database-in-silverlight/

于 2014-12-04T00:30:28.473 回答