如何在派生对象上强制属性值?

时间:2016-10-30 19:44:18

标签: c# winforms listview windows-forms-designer

我想创建一个派生自ListView对象的类。

class MyListView : ListView
{
}

我尝试了一些强制默认View属性的东西,但在设计时,我似乎没有做任何对象属性的影响。

我尝试过的一些事情是......

public MyListView():base()
{
    base.View = View.Tile;
}

[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
[DefaultValue(View.Tile)]
new public View View
{
    get {
        return base.View;
    }
    set {
        base.View = value;
    }
}

protected override void InitLayout()
{
    base.InitLayout();
    base.View = View.Tile;
}

所以我的问题是如何强制值始终在View属性上持久化,或者如何为其设置默认值并在新类中隐藏属性?

1 个答案:

答案 0 :(得分:1)

在正常情况下,它足以覆盖属性并将所需的值放在getter和setter中。但ListView的{​​{1}}属性是一种特殊情况。 ListViewDesigner为设计师添加了一个带阴影的View属性。

如果您查看ListViewDesigner课程,您将看到无论您的new视图属性如何,设计人员都使用基类的View属性:((ListView) base.Component).View = value;

我们可以做些什么来强制ListView在设计时使用特定的视图?

您可以使用View修饰新的Browsable(false)媒体资源。这样,它不会在属性网格中显示View属性,但会在控件操作列表中显示该属性。

要删除该操作列表,您可以为您的控件注册其他Designer,例如ControlDesigner

[Designer(typeof(ControlDesigner))]
public class MyListView : ListView
{
    public MyListView()
    {
        this.View = System.Windows.Forms.View.Tile;
    }
    [Browsable(false)]
    new public View View
    {
        get
        {
            return System.Windows.Forms.View.Tile;
        }
        set
        {
            base.View = System.Windows.Forms.View.Tile;
        }
    }
}

另外,作为另一个选项,您可以获取控件的设计器实例并清除其操作列表,而不是注册新的设计器。

不要忘记添加对System.Design.dll的引用并添加using System.Windows.Forms.Design;