Как говорится, лучше 1 раз увидеть, чем 100 раз услышать. Создаю пару классов, в которых реализую свойство зависимостей и хочу посмотреть путь инициализации объектов. То, что увидел - меня несколько озадачило. Итак исходные данные Создал два класса. 1-й класс: | Код | using System; using System.Windows; using System.Windows.Controls;
namespace Compositum.Laboratories.AnalysisDependencyProperty { /// <summary> /// Данный класс делаю производным от ContentControl, чтобы пока не заморачиваться /// с реализацией наследования... /// </summary> class FirstClass : ContentControl { public FirstClass(string name) { Name = name; Console.WriteLine("Создаётся экземпляр класса {0}. Экземпляру присвоено имя {1}", this.GetType().Name, Name); } public static readonly DependencyProperty MyIntProperty; /// <summary> /// Собственно свойство, посредством которого получаю доступ.... /// </summary> public int MyInt { get { return (int)GetValue(MyIntProperty); } set { SetValue(MyIntProperty, value); } } static FirstClass() { FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata(); metadata.DefaultValue = 7; metadata.Inherits = true; metadata.PropertyChangedCallback += MyIntValueChenged; MyIntProperty = DependencyProperty.Register("MyIntProperty", typeof(int), typeof(FirstClass), metadata, CheckMyIntValue); } static bool CheckMyIntValue(object value) { Console.WriteLine("Результат проверки присваиваемого значения свойства MyInt класса FirstClass:"); if ((int)value >= 0) { Console.WriteLine("Присваиваемое значение соответствует требованиям."); return true; } else { Console.WriteLine("Присваиваемое значение Н0Е соответствует требованиям!"); return false; } } static void MyIntValueChenged(object sender, DependencyPropertyChangedEventArgs args) { Console.WriteLine("Происходит изменение значения {2}, пренадлежащего классу {3}: \nПрежнее значение: {0}\nНовое значение: {1}", args.OldValue, args.NewValue, args.Property.Name, args.Property.OwnerType); } } }
|
2-й класс: | Код | using System; using System.Windows; using System.Windows.Controls;
namespace Compositum.Laboratories.AnalysisDependencyProperty { /// <summary> /// Данный класс делаю производным от ContentControl, чтобы пока не заморачиваться /// с реализацией наследования... /// </summary> class SecondClass : ContentControl { public SecondClass(string name) { Name = name; Console.WriteLine("Создаётся экземпляр класса {0}. Экземпляру присвоено имя {1}", this.GetType().Name, Name); }
public static readonly DependencyProperty MyIntProperty; public int MyInt { get { return (int)GetValue(MyIntProperty); } set { SetValue(MyIntProperty, value); } } static SecondClass() { FrameworkPropertyMetadata metadata = new FrameworkPropertyMetadata(); metadata.DefaultValue = 77; metadata.Inherits = true; metadata.PropertyChangedCallback += MyPropertyChenged; MyIntProperty = FirstClass.MyIntProperty.AddOwner(typeof(SecondClass)); MyIntProperty.OverrideMetadata(typeof(SecondClass), metadata); } static void MyPropertyChenged(object sender, DependencyPropertyChangedEventArgs args) { Console.WriteLine("Происходит изменение значения {2}, пренадлежащего классу {3}: \nПрежнее значение: {0}\nНовое значение: {1}", args.OldValue, args.NewValue, args.Property.Name, args.Property.OwnerType); } } }
|
Создаю точку входа: | Код | using System; using System.Windows; using System.Windows.Controls; using Compositum.Laboratories.CommonClasses; using System.Reflection; using System.IO; using System.Collections; using System.Windows.Media;
namespace Compositum.Laboratories.AnalysisDependencyProperty { class Program { [STAThread] static void Main() { FirstClass fClass1 = new FirstClass("fClass1"); FirstClass fClass2 = new FirstClass("fClass2"); Console.WriteLine(new string('=', 30)); fClass1.Content = fClass2; fClass1.MyInt = 8; Console.Read(); } } }
|
Памятуя, что статический конструктор запускается раньше конструктора создания экземпляра (если мне не изменяет память) я ожидал увидеть в окне консоли следующий результат: | Цитата | Результат проверки присваиваемого значения свойства MyInt класса FirstClass: Присваиваемое значение соответствует требованиям. Создаётся экземпляр класса FirstClass. Экземпляру присвоено имя fClass1 Результат проверки присваиваемого значения свойства MyInt класса FirstClass: Присваиваемое значение соответствует требованиям. Создаётся экземпляр класса FirstClass. Экземпляру присвоено имя fClass2 ============================== Результат проверки присваиваемого значения свойства MyInt класса FirstClass: Присваиваемое значение соответствует требованиям. Происходит изменение значения MyIntProperty, пренадлежащего классу Compositum.La boratories.AnalysisDependencyProperty.FirstClass: Прежнее значение: 7 Новое значение: 8 Результат проверки присваиваемого значения свойства MyInt класса FirstClass: Присваиваемое значение соответствует требованиям. Происходит изменение значения MyIntProperty, пренадлежащего классу Compositum.La boratories.AnalysisDependencyProperty.FirstClass: Прежнее значение: 7 Новое значение: 8
|
Однако по факту получаю это: | Цитата | Результат проверки присваиваемого значения свойства MyInt класса FirstClass: Присваиваемое значение соответствует требованиям. Результат проверки присваиваемого значения свойства MyInt класса FirstClass: Присваиваемое значение соответствует требованиям. Создаётся экземпляр класса FirstClass. Экземпляру присвоено имя fClass1 Создаётся экземпляр класса FirstClass. Экземпляру присвоено имя fClass2 ============================== Результат проверки присваиваемого значения свойства MyInt класса FirstClass: Присваиваемое значение соответствует требованиям. Происходит изменение значения MyIntProperty, пренадлежащего классу Compositum.La boratories.AnalysisDependencyProperty.FirstClass: Прежнее значение: 7 Новое значение: 8 Происходит изменение значения MyIntProperty, пренадлежащего классу Compositum.La boratories.AnalysisDependencyProperty.FirstClass: Прежнее значение: 7 Новое значение: 8
|
Как видим, моё видение предполагаемого развития событий ни в какие ворота не лезут по сравнению с реальным положением дел... Кто может объяснить получаемый результат, где моя ошибка?
|