Question

J'ai un contrôle personnalisé qui possède une propriété Items. J'ai demandé un EditorAttribute avec un UITypeEditor de type CollectionEditor.

Collection Type:

[Serializable]
[Editor(typeof(CollectionEditor), typeof(UITypeEditor))]
public class ListItemsCollection : CollectionBase
{
    // methods
}

Déclaration de propriété dans le contrôle:

private new ListItemsCollection _Items;

[Editor(typeof(CollectionEditor), typeof(UITypeEditor))]
public new ListItemsCollection Items
{
    get
    {
        return _Items;
    }
    set
    {
        _Items = value;

        // do other UI changes
    }
}

Problème: Quand je laisse tomber ce contrôle à la surface du concepteur, je suis en mesure d'ajouter des éléments à la propriété Items à l'aide du PropertyGrid. Mais, quand je le clique sur le bouton Ok du CollectionEditor le poseur de la propriété Items n'est pas appelé.

AFAIK lorsqu'une valeur est retournée par la méthode de EditValue d'une classe UITypeEditor le bloc setter de la propriété est censé être appelé.

Ce me rend fou. J'ai même essayé d'ajouter de Event à la ListItemsCollection, de sorte que lorsque les éléments sont ajoutés, je peux tout ce que je veux avec ui du contrôle.

Ce n'est pas censé être difficile. Qu'est-ce que je fais mal?

Était-ce utile?

La solution

J'essaie de reprodeuce votre situation: en utilisant le code suivant, je reçois une boîte de message indiquant chaque fois que je modifier la liste de la fenêtre de la propriété VS. Méfiez-vous que vous devez créer la liste par vous-même. Si vous ne créez pas, VS créer une liste temporaire que vous pouvez modifier à partir de la fenêtre de la propriété, mais ne fixe pas votre propriété à cette liste (si votre setter ne sera jamais appelé)

    public UserControl1()
    {
        InitializeComponent();
        list = new BindingList<ListViewItem>();
        list.ListChanged += new ListChangedEventHandler(list_ListChanged);
    }

    void list_ListChanged(object sender, ListChangedEventArgs e)
    {
        MessageBox.Show(e.ListChangedType.ToString());
    }

    private BindingList<ListViewItem> list;

    public BindingList<ListViewItem> List1
    {
        get { return list; }
    }

Autres conseils

Propriétés de la collection doit être en lecture seule. Il est la collection qui est récupéré par le getter et ajusté. Le compositeur entre jamais en elle, parce que cela signifierait la mise une nouvelle collection.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top