मैं जोड़ने के लिए कुछ ख़ास नहीं है, लेकिन मैं ने पाया है कि मैं करने की जरूरत है MyConstructor(): आधार() को 1 मामले में कोई पैराम के साथ कॉल करें। मेरे पास एक बेस क्लास है जो INotifyProperty को लागू करता है जिस तरह से मेरे पास एक रजिस्टरप्रॉपर्टीज() वर्चुअल फ़ंक्शन है। जब मैं इसे ओवरराइड करता हूं, इसे बेस कन्स्ट्रक्टर में बुलाया जाता है। इसलिए मैं इसे हाल ही में व्युत्पन्न उप-वर्गों में कॉल करने के लिए समाप्त कर रहा हूं क्योंकि ओवरराइड वर्चुअल को पहचानने से पहले बेस को स्पष्ट रूप से बुलाया गया था। मेरे गुण तब तक सूचित नहीं करते जब तक कि मैं ऐसा नहीं करता। संपूर्ण आधार वर्ग नीचे है।
मैंने सीधे नीचे डेटाबेस डाटाबेस उपclass जोड़ा। खाली आधार() कॉल के बिना, मेरी संपत्ति OnPropertyChanged() को कॉल नहीं करती है।
[DataContract]
public abstract class DataModelBase : INotifyPropertyChanged, IDataErrorInfo {
#region Properties
[IgnoreDataMember]
public object Self {
get { return this; }
//only here to trigger change
set { OnPropertyChanged("Self"); }
}
#endregion Properties
#region Members
[IgnoreDataMember]
public Dispatcher Dispatcher { get; set; }
[DataMember]
private Dictionary<object, string> _properties = new Dictionary<object, string>();
#endregion Members
#region Initialization
public DataModelBase() {
if(Application.Current != null) Dispatcher = Application.Current.Dispatcher;
_properties.Clear();
RegisterProperties();
}
#endregion Initialization
#region Abstract Methods
/// <summary>
/// This method must be defined
/// </summar
protected abstract void RegisterProperties();
#endregion Abstract Methods
#region Behavior
protected virtual void OnPropertyChanged(string propertyName) {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
protected bool RegisterProperty<T>(ref T property, string propertyName) {
//causes problems in design mode
//if (property == null) throw new Exception("DataModelBase.RegisterProperty<T> : ref T property cannot be null.");
if (_properties.ContainsKey(property)) return false;
_properties.Add(property, propertyName);
return true;
}
protected string GetPropertyName<T>(ref T property) {
if (_properties.ContainsKey(property))
return _properties[property];
return string.Empty;
}
protected bool SetProperty<T>(ref T property, T value) {
//if (EqualityComparer<T>.Default.Equals(property, value)) return false;
property = value;
OnPropertyChanged(GetPropertyName(ref property));
OnPropertyChanged("Self");
return true;
}
[OnDeserialized]
public void AfterSerialization(StreamingContext context) {
if (Application.Current != null) Dispatcher = Application.Current.Dispatcher;
//---for some reason this member is not allocated after serialization
if (_properties == null) _properties = new Dictionary<object, string>();
_properties.Clear();
RegisterProperties();
}
#endregion Behavior
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion INotifyPropertyChanged Members
#region IDataErrorInfo Members
string IDataErrorInfo.Error {
get { throw new NotImplementedException(); }
}
string IDataErrorInfo.this[string propertyName] {
get { throw new NotImplementedException(); }
}
#endregion IDataErrorInfo Members
} //End class DataModelBaseclass DataModelBase
/*I decided to add an example subclass*/
[DataContract]
public abstract class DatabaseTraits : DataModelBase {
#region Properties
private long _id = -1;
[DataMember]
public long Id {
get { return _id; }
set { SetProperty(ref _id, value); }
}
private bool _isLocked = false;
[DataMember]
public bool IsLocked {
get { return _isLocked; }
set { SetProperty(ref _isLocked, value); }
}
private string _lockedBy = string.Empty;
[DataMember]
public string LockedBy {
get { return _lockedBy; }
set { SetProperty(ref _lockedBy, value); }
}
private DateTime _lockDate = new DateTime(0);
[DataMember]
public DateTime LockDate {
get { return _lockDate; }
set { SetProperty(ref _lockDate, value); }
}
private bool _isDeleted = false;
[DataMember]
public bool IsDeleted {
get { return _isDeleted; }
set { SetProperty(ref _isDeleted, value); }
}
#endregion Properties
#region Initialization
public DatabaseTraits() : base() {
/*makes sure my overriden RegisterProperties() is called.*/
}
protected override void RegisterProperties() {
RegisterProperty(ref _id, "Id");
RegisterProperty(ref _isLocked, "IsLocked");
RegisterProperty(ref _lockedBy, "LockedBy");
RegisterProperty(ref _lockDate, "LockDate");
RegisterProperty(ref _isDeleted, "IsDeleted");
}
#endregion Initialization
#region Methods
public void Copy(DatabaseTraits that) {
Id = that.Id;
IsLocked = that.IsLocked;
LockedBy = that.LockedBy;
LockDate = that.LockDate;
IsDeleted = that.IsDeleted;
}
#endregion Methods
}
तकनीकी रूप से, 'आयु' एक निजी सदस्य है, जो संकलित नहीं होगा। काम करने के लिए इसे 'सार्वजनिक' होना चाहिए। –
क्षमा करें, मुझे इसका एहसास नहीं हुआ। लेकिन यह सिर्फ मेरे प्रश्न को स्पष्ट करने के लिए है। –
यदि आप नॉन-स्टेटिक कन्स्ट्रक्टर के लिए न तो 'बेस (...)' और न ही ': यह (...)' निर्दिष्ट करते हैं, तो डिफ़ॉल्ट 'बेस() 'i.e. शून्य-पैरामीटर बेस-क्लास कन्स्ट्रक्टर है। आपके पास पहले वर्ग 'व्यक्ति' के साथ भी है जहां आपका 'व्यक्ति() 'कन्स्ट्रक्टर स्पष्ट रूप से' ऑब्जेक्ट() 'बेस क्लास कन्स्ट्रक्टर को कॉल करता है। लेखन ': आधार() '(शून्य तर्क) हमेशा अनावश्यक है। अपने उदाहरण को फिर से प्रयास करें जहां 'व्यक्ति' वर्ग निर्माता एक या अधिक पैरामीटर लेता है। –