0

計算列を使用してグリッドに表示しようとしています。

3 つのプロパティを持つ EF コード ジェネレーターによって自動的に生成された部分クラスがあります。別の部分クラスを作成し、そこに計算フィールドを追加しようとしています。

Public partial class Employee
{
public decimal? totalSalary
{
get

{
return salary*wagerate+bonus;
}
}
}

最初はうまくいきますが、給与/ボーナス/時間を変更するとうまくいきません。これらのフィールドをグリッド内で使用しています

これがEFエンティティジェネレーターによって生成された私のコードです

//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated from a template.
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Globalization;
using System.Runtime.Serialization;
using System.ComponentModel.DataAnnotations;

namespace Employees.Contract
{
[DataContract(IsReference = true)]
[KnownType(typeof(Department))]
[KnownType(typeof(PropertyType))]
public partial class Employee: IObjectWithChangeTracker, INotifyPropertyChanged,IDataErrorInfo
{

    [NonSerialized]
    private CLOS.Contract.Validation.DataErrorInfoSupport dataErrorInfoSupport;

    public Employee()
    {            
        dataErrorInfoSupport = new CLOS.Contract.Validation.DataErrorInfoSupport(this);
        Init();
    }

    partial void Init();

    string IDataErrorInfo.Error { get { return dataErrorInfoSupport.Error; } }

    string IDataErrorInfo.this[string memberName] { get { return dataErrorInfoSupport[memberName]; } }

    #region Primitive Properties


    [DataMember]
    public Nullable<decimal> Salary
    {
        get { return _salary; }
        set
        {
            if (_salary != value)
            {
                _salary = value;
                OnPropertyChanged("Salary");
            }
        }
    }
    private Nullable<decimal> _salary;

    [DataMember]
    public Nullable<decimal> WageRate
    {
        get { return _wageRate; }
        set
        {
            if (_wageRate != value)
            {
                _wageRate = value;
                OnPropertyChanged("WageRate");
            }
        }
    }
    private Nullable<decimal> _wageRate;

    [DataMember]
    public Nullable<decimal> Bonus
    {
        get { return _bonus; }
        set
        {
            if (_bonus != value)
            {
                _bonus = value;
                OnPropertyChanged("Bonus");
            }
        }
    }
    private Nullable<decimal> _bonus;

    #endregion
    #region Navigation Properties

    [DataMember]
    public Department Department
    {
        get { return _department; }
        set
        {
            if (!ReferenceEquals(_department, value))
            {
                var previousValue = _department;
                _department = value;
                OnNavigationPropertyChanged("Department");
            }
        }
    }
    private Borrower _department;

    [DataMember]
    public PropertyType PropertyType
    {
        get { return _propertyType; }
        set
        {
            if (!ReferenceEquals(_propertyType, value))
            {
                var previousValue = _propertyType;
                _propertyType = value;

                OnNavigationPropertyChanged("PropertyType");
            }
        }
    }
    private PropertyType _propertyType;

    #endregion
    #region ChangeTracking

    protected virtual void OnPropertyChanged(String propertyName)
    {
        if (ChangeTracker.State != ObjectState.Added && ChangeTracker.State != ObjectState.Deleted)
        {
            ChangeTracker.State = ObjectState.Modified;
        }
        if (_propertyChanged != null)
        {
            _propertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    protected virtual void OnNavigationPropertyChanged(String propertyName)
    {
        if (_propertyChanged != null)
        {
            _propertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged{ add { _propertyChanged += value; } remove { _propertyChanged -= value; } }
    private event PropertyChangedEventHandler _propertyChanged;
    private ObjectChangeTracker _changeTracker;

    [DataMember]
    public ObjectChangeTracker ChangeTracker
    {
        get
        {
            if (_changeTracker == null)
            {
                _changeTracker = new ObjectChangeTracker();
                _changeTracker.ObjectStateChanging += HandleObjectStateChanging;
            }
            return _changeTracker;
        }
        set
        {
            if(_changeTracker != null)
            {
                _changeTracker.ObjectStateChanging -= HandleObjectStateChanging;
            }
            _changeTracker = value;
            if(_changeTracker != null)
            {
                _changeTracker.ObjectStateChanging += HandleObjectStateChanging;
            }
        }
    }

    private void HandleObjectStateChanging(object sender, ObjectStateChangingEventArgs e)
    {
        if (e.NewState == ObjectState.Deleted)
        {
            ClearNavigationProperties();
        }
    }

    protected bool IsDeserializing { get; private set; }

    [OnDeserializing]
    public void OnDeserializingMethod(StreamingContext context)
    {
        IsDeserializing = true;
    }

    [OnDeserialized]
    public void OnDeserializedMethod(StreamingContext context)
    {
        dataErrorInfoSupport = new CLOS.Contract.Validation.DataErrorInfoSupport(this);
        IsDeserializing = false;
        ChangeTracker.ChangeTrackingEnabled = true;
    }

    protected virtual void ClearNavigationProperties()
    {
        Department = null;
        PropertyType = null;
    }

    #endregion
}

}

クラスが再生成されるとコードが消去されるため、EF Generated クラスに Hours、Wage、Overtime プロパティを配置しても機能しますOnPropertyChanged("Salary")(これは良い考えではありません)。

どんな助けでも大歓迎です。(書式設定について申し訳ありません、これは私の最初の質問です)

ありがとう

4

2 に答える 2

1

部分クラスでは、部分 Init メソッドを使用して PropertyChanged イベントをサブスクライブし、給与、賃金、またはボーナスのいずれかのプロパティが変更されたときに、totalSalary の変更をクライアントに通知します。

この方法では、生成されたコードを変更する必要はありません。(そのため、Init メソッドは部分的です)。

public partial class Employee
{

    partial void Init()
    {
        _propertyChanged += PropertyChangedHandler;
    }

    void PropertyChangedHandler(object sender, PropertyChangedEventArgs args)
    {
        if(args.PropertyName == "salary" ||
           args.PropertyName == "wagerate" ||
           args.PropertyName == "bonus")
         {
             OnPropertyChanged("totalSalary");
         }
    }

    public decimal? totalSalary
    {
        get
        {
            return salary * wagerate + bonus;
        }
    }
}
于 2013-01-14T06:09:57.420 に答える
0

これが、MVVM が一般的なデザイン パターンである理由です。従業員 (モデル) を新しいクラス (ビューモデル) でラップすると、グリッド (ビュー) に渡す前にカスタマイズしやすくなります。

ただし、現在のコードを機能させるハックな方法は、部分クラスで現在の PropertyChanged イベントにアタッチし、現在OnPropertyChanged("Salary")のプロパティ名が依存プロパティの 1 つと一致する場合に呼び出すことです (再帰に注意してください!)。

于 2013-01-14T02:44:03.717 に答える