Ho un metodo di estensione per sottoscrivere un evento PropertyChanged
di un oggetto che implementa INotifyPropertyChanged
.Annullamento dell'iscrizione dal gestore di eventi anonimi all'interno di un metodo statico (metodo di estensione)
Mi piacerebbe che l'evento si accenda solo una volta. Non di più.
Questo è il mio metodo.
public static void OnPropertyChanged<T>(this INotifyPropertyChanged target, string propertyName, Action action)
{
if (target == null)
{
return;
}
PropertyChangedEventHandler handler = (obj, e) =>
{
if (propertyName == e.PropertyName)
{
action();
}
};
target.PropertyChanged -= handler;
target.PropertyChanged += handler;
}
Ma non funziona. Non riesco a rimuovere il gestore eventi in modo che l'evento venga attivato ogni volta che chiamo questo metodo.
Ho provato un approccio diverso. Invece di usare metodi annonymous, qualcosa di più tradizionale, in questo modo:
public static void OnPropertyChanged<T>(this INotifyPropertyChanged target, string propertyName, Action action)
{
if (target == null)
{
return;
}
target.PropertyChanged -= target_PropertyChanged;
target.PropertyChanged += target_PropertyChanged;
}
static void target_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
//do stuff here
}
E funziona bene. L'evento si attiva solo una volta, ma ho anche bisogno del parametro Action. Non posso usarlo con questo approccio.
Qualsiasi soluzione alternativa o approccio diverso per risolvere questo problema? Esiste qualcosa di strano con metodi anonimi all'interno di metodi statici?
Grazie in anticipo.
+1 per l'idea di una classe contenitore, ma penso che questo sia inutilmente complicato: un 'Dictionary' può contenere un delegato per nome proprietà. (Sì, questo è un diverso tipo di classe contenitore.) –
hvd
Sì, volevo solo presentare una soluzione generica. Quello che stavo implicitamente cercando di trasmettere è che i metodi anonimi con chiusura generano una classe contenitore dietro le quinte che contiene riferimenti alle variabili catturate. Quindi in sostanza è lo stesso tipo di comportamento, ma lo faresti esplicitamente .. –
Grazie mille. Funziona!!! Il 'PropertyChangedEventHandler' si attiva solo una volta. – Nadya