#150 – An Example of Using PropertyChanged and CoerceValue Callbacks(PropertyChanged和CoerceValue例子)

来源:互联网 发布:三只眼漫画软件 编辑:程序博客网 时间:2024/05/17 08:41

在使用依赖属性的时候,有的时候可能会遇到需要强制限定多个依赖属性之间的关系的情况,这个时候一般会用CoerceValueCallbackPropertyChangedCallbacks 来实现。

举个例子,假定我们有一个Person 类,有BirthYear(出生)、DeathYear(去世) 和MarriageYear(结婚) 三个属性。我们确定结婚时间必须在出生和去世之间,出生时间必须早于另外两个,而去世时间不得早于出生和结婚。


BirthYear 属性

  public int BirthYear        {            get { return (int)GetValue(BirthYearProperty); }            set { SetValue(BirthYearProperty, value); }        }        public static readonly DependencyProperty BirthYearProperty =            DependencyProperty.Register("BirthYear", typeof(int), typeof(Person),                new PropertyMetadata(                    1900,       // Default                    new PropertyChangedCallback(OnBirthYearChanged)));        public static void OnBirthYearChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)        {            Person p = (Person)d;            p.CoerceValue(DeathYearProperty);            p.CoerceValue(MarriageYearProperty);        }


DeathYear 属性

     public int DeathYear        {            get { return (int)GetValue(DeathYearProperty); }            set { SetValue(DeathYearProperty, value); }        }        // Using a DependencyProperty as the backing store for DeathYear.  This enables animation, styling, binding, etc...        public static readonly DependencyProperty DeathYearProperty =            DependencyProperty.Register("DeathYear", typeof(int), typeof(Person),                new PropertyMetadata(                    1900,       // Default                    new PropertyChangedCallback(OnDeathYearChanged),                    new CoerceValueCallback(CoerceDeathYear)));        public static void OnDeathYearChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)        {            Person p = (Person)d;            p.CoerceValue(MarriageYearProperty);        }        public static object CoerceDeathYear(DependencyObject d, object value)        {            Person p = (Person)d;            int deathYear = (int)value;            if (deathYear < p.BirthYear)                deathYear = p.BirthYear;            return deathYear;        }


MarriageYear 属性

public int MarriageYear{    get { return (int)GetValue(MarriageYearProperty); }    set { SetValue(MarriageYearProperty, value); }} // Using a DependencyProperty as the backing store for DeathYear.  This enables animation, styling, binding, etc...public static readonly DependencyProperty MarriageYearProperty =    DependencyProperty.Register("MarriageYear", typeof(int), typeof(Person),        new PropertyMetadata(            1900,       // Default            null,            new CoerceValueCallback(CoerceMarriageYear))); public static object CoerceMarriageYear(DependencyObject d, object value){    Person p = (Person)d;    int marriageYear = (int)value;     if (marriageYear < p.BirthYear)        marriageYear = p.BirthYear;    if (marriageYear > p.DeathYear)        marriageYear = p.DeathYear;     return marriageYear;}




0 0