WPF Dependency property ,overrideMetaData issue

 

Seems to knowbecause MyStackPanel2 has  register, so will new a property, _metaMap has no base type's metadata, so if we use

 static MyStackPanel2()
        {
            MyStackPanel.IntDataProperty.OverrideMetadata(typeof(MyStackPanel2), new FrameworkPropertyMetadata(9));
 
            MyStackPanel.MinDateProperty.AddOwner(typeof(MyStackPanel2), new FrameworkPropertyMetadata(DateTime.Now, onMindateChange2));
        }

 

The new metadata will merge basetype's metadata! For attached property, although register’s metaData is only stored at defaultmetaData _metaMap have no but overrideMetaData method will add new metadata to _metaMap, and will do merge too.

And,MyStackPanel2 is sub class of MyStackPanel, so the merge will happen, if not sub class ,the merge will not happen either.like the code below:

public partial class UserControlLabel : Label
{
static UserControlLabel()
        {
            MyStackPanel.MinDateProperty.OverrideMetadata(typeof(UserControlLabel), new FrameworkPropertyMetadata(DateTime.Now, onMinDateChangeUserControl));
 }
 
        public DateTime MinDate
        {
            get { return (DateTime)GetValue(MyStackPanel.MinDateProperty); }
            set { SetValue(MyStackPanel.MinDateProperty, value); }
        }
}
 
2. 

This PropertyFromName hashtable is mainly use by the xaml->code process

which can be found by analyzing the DependencyProperty.FromName() method using reflectors use by function..

3. attched property register not use overridemetedata, because its ownertype can not be dependencyObject, _metadataMap need to use 
DependencyObjectType.typeId as key.
原文地址:https://www.cnblogs.com/liangouyang/p/1260954.html