C # manipuladores de eventos personalizados
-
03-07-2019 - |
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?
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
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 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 ().