0

次のモデルを検討してください...

データ・モデル

データ・モデル

JobsViewModel にデータモデルを公開する WCF データ サービス (PMService) があります。

WCF データ サービス

namespace PM.DataService
{
    [ServiceContract]
    public class PMService
    {

[OperationContract]
    public ObservableCollection<Job> GetAllJobs()
    {
        using (var context = new logisticDBEntities())
        {
            var result = context.Jobs.ToList();
            result.ForEach(e => context.Detach(e));
            return new ObservableCollection<Job>(result);
        }
    }

    [OperationContract]
    public ObservableCollection<Status> GetStatuses()
    {
        using (var context = new logisticDBEntities())
        {
            var result = context.Statuses.ToList();
            result.ForEach(e => context.Detach(e));
            return new ObservableCollection<Status>(result);
        }
    }        
    }
}

JobsViewModel

namespace PM.UI.ViewModel
{
    public class JobsViewModel:INotifyPropertyChanged
    {
    private PMServiceClient serviceClient = new PMServiceClient();

    public JobsViewModel()
    {
        this.RefreshAllJobs();
    }

    private void RefreshAllJobs()
    {
        this.serviceClient.GetAllJobsCompleted += (s, e) =>
        {
            this.AllJobs = e.Result;
        };
        this.serviceClient.GetAllJobsAsync();
    }

    private ObservableCollection<Job> allJobs;
    public ObservableCollection<Job> AllJobs
    {
        get{
            return this.allJobs;
        }
        set
        {
            this.allJobs = value;
            OnPropertyChanged("AllJobs");
        }
    }

    private ObservableCollection<Status> statuses;
    public ObservableCollection<Status> Statuses
    {
        get
        {
            return this.statuses;
        }

        set
        {
            this.statuses = value;
            this.OnPropertyChanged("Statuses");
        }
    }

    private void OnPropertyChanged(string propertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    }
}

ビューモデルを MainWindow.xaml に含めました

MainWindow.xaml

<Window x:Class="PM.FullClient.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:PM.UI"
    xmlns:vms="clr-namespace:PM.UI.ViewModel"
    Title="MainWindow" Height="475" Width="575">
    <Window.DataContext>
        <vms:JobsViewModel/>
    </Window.DataContext>

DataGrid を使用して、すべてのジョブを正常に表示しました。

<DataGrid AutoGenerateColumns="False" 
                          ItemsSource="{Binding Path=AllJobs}" Margin="6">
                    <DataGrid.Columns>
                        <DataGridTextColumn Binding="{Binding Path=jobNo}" Header="Job #" />
                        <DataGridTextColumn Binding="{Binding  Path=jobStatus}" Header="Status" />
                        <DataGridTextColumn Binding="{Binding Path=jobDate}" Header="Date" />
                        <DataGridTextColumn Binding="{Binding Path=Statuses}" Header="Status" />
                    </DataGrid.Columns>
                </DataGrid>

JobsDataGrid_output

ここに画像の説明を入力

ご覧のとおり、JobsDataGridにはステータスのIDがあります。

現在、ステータスとジョブは 1 対多の関係にあります。Job は Status の主キーを保持します。

私がやりたいことは、jobStatus (statusId) の代わりにそれぞれの statusCaption を表示することです。

Ucodiaのアドバイスに従って編集

以下のコードを挿入しました

...
var result = context.Jobs.ToList();
    result.ForEach(e => context.LoadProperty(e, "Status"));
    result.ForEach(e => context.Detach(e));
...

結果は同じです(ステータス列はまだ空白です

アプリをデバッグ モードで実行したところ、次の結果が得られました...誰かが私が間違っていることを説明するのに役立つことを願っています。

>>>デバッグデータのスクリーンショット デバッグ情報

4

1 に答える 1

0

Jobオブジェクトを DataGrid にバインドし、列でメンバーをバインドします。これは、オブジェクト モデルがメンバーが属する具体的なオブジェクトにjobStatus移動するために使用するステータス ID です。StatusstatusCaption

したがって、オブジェクトのStatusナビゲーション プロパティを使用するように 2 番目の列バインディングを変更するだけです。Job

<DataGridTextColumn Binding="{Binding  Path=Status.statusCaption}" Header="Status" />

後で、ロード時にジョブ オブジェクトをコンテキストから切り離していることに気付きました。デフォルトでは、Job モデルの Status などのナビゲーション プロパティは遅延読み込みされます。つまり、要求された場合にのみ読み込まれます。ただし、モデルを遅延ロードするには、アタッチする必要があります。したがって、Job オブジェクトをロードするときは、エンティティをデタッチする前に、Status プロパティをロードするように明示的に要求する必要もあります。

using (var context = new logisticDBEntities())
{
    var result = context.Jobs.ToList();
    result.ForEach(e => context.LoadProperty(e, "Status"));
    result.ForEach(e => context.Detach(e));
    return new ObservableCollection<Job>(result);
}
于 2012-12-27T12:43:24.590 に答える