Pergunta

Se eu tiver uma propriedade:

public list<String> names { get; set; }

Como posso gerar e lidar com um evento personalizado por causa de argumentos chamado 'onNamesChanged' sempre que um nome é adicionado à lista?

Foi útil?

Solução

Você deve verificar o System.ComponentModel.BindingList , especificamente a ListChanged evento .

Outras dicas

Um BindingList é provável a sua melhor opção, pois tem incorporado o controle de alterações e uma variedade de eventos existentes você pode usar. Abaixo está um exemplo de expor um evento personalizado para Add que encaminha para o evento BindingList.


    class Example
    {
        private BindingList<string> m_names = new BindingList<string>();
        public IEnumerable<string> Names { get { return m_names; } }
        public event AddingNewEventHandler NamesAdded
        {
            add { m_names.AddingNew += value; }
            remove { m_names.AddingNew -= value; }
        }
        public void Add(string name)
        {
            m_names.Add(name);
        }
    }

Uma alternativa para BindingList é ObservableCollection - neste caso você' d querer assinar o seu próprio manipulador de eventos para o CollectionChanged evento e fogo o seu evento, dependendo da ação.

David Mohundro mostra uma abordagem; uma outra opção é para herdar de Collection e substituir os vários métodos:

class Foo {}
class FooCollection : Collection<Foo>
{
    protected override void InsertItem(int index, Foo item)
    {
        // your code...
        base.InsertItem(index, item);
    }
    protected override void SetItem(int index, Foo item)
    {
        // your code...
        base.SetItem(index, item);
    }
    // etc
}

Finalmente, você pode criar sua própria lista (IList, IList ) a partir de primeiros princípios -. Muito trabalho, pouco benefício

A abordagem não-ortodoxa pode estar usando um quadro AOP como PostSharp para "tecer" um manipulador antes / depois o acessor é chamado, que dispara um evento.

Você cria uma classe externa que contém o pré e / ou código postal manuseio para quando sua propriedade é acessado, verifique se o valor da propriedade mudou entre pré e pós, e elevar um evento.

Tenha em mente que, embora tendo o valor para comparação (dentro de seu código de manipulador), você pode entrar em um loop infinito (você chama o acessor propriedade, que chama o manipulador de AOP, que chama o acessor e assim por diante), então você pode precisar para refletir na classe que contém essa propriedade para alcançar o campo de apoio.

Você vai precisar para não expor a lista diretamente como uma propriedade e, talvez, ter a sua classe implementar IList ou algo assim, em seguida, ter seu manipulador de fogo evento sobre o método add ().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top