维护控件之间的子/父关系

本文关键字:关系 控件 之间 维护 | 更新日期: 2023-09-27 18:35:55

我正在编写一个WP7 GUI并设计了一个控件类,以及一个派生自Control并具有子控件列表的ParentControl类。但是,将子项添加到 ParentControl 实例时,我无法访问子项的父引用,因为我将其设置为"保护"控件的用户。

确切的错误是


"无法通过类型为"控件"的限定符访问受保护的成员"控件.Parent";
限定符的类型必须是"父控件"(或派生自它)"


    public abstract class Control //such as a button or radio button
    {
        public ParentControl Parent { get; protected set; }
    }

    public abstract class ParentControl : Control //such as a panel or menu
    {
        protected List<Control> children = new List<Control>();;
        public void AddChild(Control child, int index)
        {
            NeedSizeUpdate = true;
            if (child.Parent != null)
                child.Parent.RemoveChild(child);
            child.Parent = this; //How do I access the parent?
            children.Insert(index, child);
            OnChildAdded(index, child);
        }
    }

我该如何解决这个问题?

维护控件之间的子/父关系

是的,这是因为其他东西可能派生自 Control ,而ParentControl只能访问它派生的控件的基本成员。例如,如果Control2派生自Control,则ParentControl不会派生自Control2,因此无法访问其基本成员。

因此,您可以Parent作为公共属性,或者如果要将其隐藏在控件的一般用户之外,则可以通过接口进行访问,并显式实现它:

interface IChildControl
{
    ParentControl Parent { get; set; }
}
public abstract class Control : IChildControl //such as a button or radio button
{
    ParentControl IChildControl.Parent { get; set; }
}

显式实现(IChildControl.Parent)意味着只有一个Control实例的消费者将看不到Parent属性。必须显式强制转换为IChildControl才能访问它。