使用绑定填充WPF Datagrid(MVVM样式)

时间:2012-12-23 09:17:58

标签: wpf wcf entity-framework mvvm wpfdatagrid

我希望有人能指导我找到解决问题的正确途径。

两年前,我在他的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>

1 个答案:

答案 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;

        }
    }
}

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