2

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

私はここに来たばかりなので画像を投稿できないので、別の方法を試してみます...

ジョブ エンティティ -jobId -jobNo -jobStatus (ステータス エンティティからの外部キー) -jobDate

ステータス エンティティ -statusId -statusCaption

Relationship Job Entity * ----------- 0..1 Status Entity

JobsViewModel によってアクセスされるモデルを公開する 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);
            }
        }        
    }
}

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

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

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

    private void RefreshStatuses()
    {
        this.serviceClient.GetStatusesCompleted += (s, e) =>
        {
            this.Statuses = e.Result;
        };
        this.serviceClient.GetStatusesAsync();
    }

    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 に JobsViewModel を含めました

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

すべてのステータスを表示するようにバインドすることで、MainWindow に DataGrid を簡単に設定できるようになりました。

<DataGrid ItemsSource="{Binding Path=Statuses}" Margin="7,8,9,8" AutoGenerateColumns="True">

それは機能しますが、ここに画像を投稿できないため、出力を表示できません

しかし、ジョブズで同じことをしようとすると... 何も起こりません。データグリッドは空です

<DataGrid AutoGenerateColumns="True" ItemsSource="{Binding Path=AllJobs}" Margin="6">
</DataGrid>

私は多くの方法論を調べて、たくさんのフォームやウェブサイトを検索してきましたが、ついにここに来ました.

Jobs と Statuses の間の Status > Job 関係の cos でしょうか? もしそうなら、どうすればこれを修正できますか?

4

1 に答える 1

3

問題は、RefreshAllJobs()コールバックで、 AllJobsプロパティ(大文字の'A')ではなくallJobsフィールド(小文字の'a')を設定すると、OnPropertyChanged()がプロパティから呼び出されないことです。セッター。

于 2012-12-27T08:41:59.900 に答える