voorwaardelijke eigenschappen

Ik heb een basisklasse (knooppunt) en een aantal overerfde typen.

Class Node
{
    Base_Attributes...
}

Class Derived : Node
{
    Derived_Attributes...
}

Deze typen staan ​​in een dll die ik aan mijn project heb toegevoegd. En er is een klasse, laten we zeggen Item, dat een van de attributen Knooppunt is. Ik heb een Propertygrid waarin ik de eigenschappen van itme als volgt toon:

Class Item
{
Point location;
String name;
Node quiddity;

bool[] IsBrowsable;

public Point Location{set;get;}
public String Name{set;get;}
public String NodeAttrib{set;get;}
[Browsable(IsBrowsable[thisindex])]
public String DerivedTypeAttribe{set;get;}
[Browsable(IsBrowsable[otheroneindex])]
public String DerivedTypeAttribe{set;get;}

Item(string type)
{
    switch(type)
    {
        case"some":
            Node = new derived_some();
            IsBrowsable[thisindex] = true;
            break;
    }
}
}

en ergens in hoofdformulier:

propertygrid.selectedobject = item;

Het probleem hier is dat er een aantal eigenschappen gespecificeerd zijn naar afgeleide types en ik moet ze laten zien in het propetygrid, maar het type knooppunt is pas in run-time bekend. Ik heb geprobeerd het kenmerk Browsabl() in te stellen met een reeks booleans, maar bleek Browsable Parameter een constante waarde te zijn. Om het even welke ideeën hoe kon ik dit overgaan?

2
Heb geen tijd om er volledig op in te gaan, maar het is echt de bedoeling dat je dit kunt doen met TypeConverter of (ingewikkelder) ICustomTypeDescriptior. Gewoonlijk is het overerven van ExpandableTypeConverter en het overschrijven van GetProperties (en filteren waar nodig) voldoende.
toegevoegd de auteur Marc Gravell, de bron
Bedankt voor uw reactie. Wilt u alstublieft meer details geven over hoe zou ik dit kunnen bereiken?
toegevoegd de auteur void, de bron

1 antwoord

Hier is een voorbeeld van filteren via TypeDescriptor ; je kunt natuurlijk de "hoe weet ik weten welke eigenschappen om te tonen" -code wijzigen - dit is puur illustratief:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        PropertyGrid grid;
        using (var form = new Form
        {
            Controls = { (grid = new PropertyGrid { Dock = DockStyle.Fill}) }
        })
        {
            grid.SelectedObject = new Magic {ShowY = false};
            Application.Run(form);
        }
    }
}

[TypeConverter(typeof(MagicTypeConverter))]
public class Magic
{
    public Magic()
    {
        ShowX = ShowY = ShowZ = true;
    }

    public int A { get; set; }
    public bool B { get; set; }
    public string C { get; set; }
    public int X { get; set; }
    public bool Y { get; set; }
    public string Z { get; set; }

    [Browsable(false)]
    public bool ShowX { get; set; }
    [Browsable(false)]
    public bool ShowY { get; set; }
    [Browsable(false)]
    public bool ShowZ { get; set; }

    private class MagicTypeConverter : ExpandableObjectConverter
    {
        public override PropertyDescriptorCollection GetProperties(
             ITypeDescriptorContext context, object value,
             Attribute[] attributes)
        {
            var original = base.GetProperties(context, value, attributes);
            var list = new List(original.Count);
            var magic = (Magic)value;
            foreach (PropertyDescriptor prop in original)
            {
                bool showProp = true;
                switch (prop.Name)
                {
                    case "X": showProp = magic.ShowX; break;
                    case "Y": showProp = magic.ShowY; break;
                    case "Z": showProp = magic.ShowZ; break;
                }
                if (showProp) list.Add(prop);
            }
            return new PropertyDescriptorCollection(list.ToArray());
        }
    }
}
1
toegevoegd
Bedankt. Het was echt illustratief en maakte het prima.
toegevoegd de auteur void, de bron