PropertyChangedCallback封装

时间:2012-02-10 13:04:56

标签: c# wpf callback encapsulation

这一直困扰着我一段时间,所以我问同事他是否能够理解它,现在我在这里;)

为什么你可以在依赖属性的PropertyChangedCallback中访问持有类的私有成员?
让我通过这个例子进一步解释我的意思:

 /// <summary>
    /// Interaction logic for ZeControl.xaml
    /// </summary>
    public partial class ZeControl : UserControl
    {
        public ZeControl()
        {
            InitializeComponent();
        }

        private bool m_Trololo; //Please note that this field is PRIVATE!

        #region Text
        public string Text
        {
            get { return (string)GetValue(TextProperty); }
            set { SetValue(TextProperty, value); }
        }

        // Using a DependencyProperty as the backing store for Text.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TextProperty =
            DependencyProperty.Register("Text", typeof(string), typeof(ZeControl), new UIPropertyMetadata(
                new PropertyChangedCallback((dpo, dpce) =>
                    {
                        ((ZeControl)dpo).m_Trololo = true; //How the hell?
                        //this.m_Trololo <-- would not compile, the callback is static.
                    })));
        #endregion
    }

这不是打破封装吗?它甚至如何编译?

我之所以这样问,主要是因为我在我的WPF应用程序中使用它:它允许我保持变量私有,同时仍然在回调中访问它。
但是因为它确实感觉不对,我不希望这在WPF vNext中“修复”,使我的应用程序不兼容。

致以最诚挚的问候,

BAB。

1 个答案:

答案 0 :(得分:4)

回调是在拥有私有成员的同一个类中定义的,这种访问没有任何问题。私有实例成员看起来似乎是“从外部”访问,但你仍然在同一个类中,这似乎很奇怪。