public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }       
        private void button1_Click(object sender, RoutedEventArgs e)
        {
            Person pp = new Person();
            MessageBox.Show(pp.name);
            pp.age = 16;
            MessageBox.Show(pp.name);
            MessageBox.Show(pp.like);
        }
    }    
    public class Person:DependencyObject
    {
        public int age;
        public string like;
        public static readonly DependencyProperty nameProperty = DependencyProperty.Register("name", typeof(string), typeof(Person), new PropertyMetadata("熊俊", new PropertyChangedCallback(namechanged),new CoerceValueCallback(agename)));  //注册依赖项属性
        public string name
        {
            get { return (string)GetValue(nameProperty); }
            set { SetValue(nameProperty, value); }
        }
        public static void namechanged(DependencyObject d, DependencyPropertyChangedEventArgs e) //属性值更改通知
        {
            Person p = (d as Person);
            p.like = "我喜欢" + e.NewValue.ToString();
        }
        public static object agename(DependencyObject d, object e)  //属性值限制
        {
            int g = (d as Person).age;
            if (g > 40)
                return "熊俊";
            return "萧蔷";
        }
    }上面的代码中,age值变更了,为什么name值没有变呢?是不是agename方法没有执行呢?namechanged方法为什么又没有执行?这两个委托都是注册依赖项属性时,写进去了的啊?

解决方案 »

  1.   

    age改变的时候,不会引起任何反应吧???你改变name自然就会触发 namechanged了
      

  2.   

    那这样写:
     private void button1_Click(object sender, RoutedEventArgs e)
        {
            Person pp = new Person();
            pp.name = "张三";
            MessageBox.Show(pp.like);
        }为什么,输出的是:我喜欢萧蔷,应该是“我喜欢张三”啊?
      

  3.   

    单步跟踪一下代码,看看namechanged函数有没有被触发。