Entwickler-Ecke

WPF / Silverlight - Delegates und Events Problem


ticcoid - Di 14.04.09 16:59
Titel: Delegates und Events Problem
hallo,

ich habe folgendes vor. ich habe in silverlight ein datagrid und habe dazu ein event (PreparingCellForEdit) das gefeuert wird sobald ich eine zelle bearbeiten will. wenn das passiert ist dann wird anschließend ein zweites event gefeuert (LostFocus). ich möchte eigentlich "nur" folgendes erreichen.

das object sender was im event PreparingCellForEdit will ich auch im event LostFocus haben. wie genau stelle ich das an, dass es da ist? ich müsste das doch irgenwie mit einem delegaten hinkriegen oder? Hat jemand eine Idee?

Vielen Dank




C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
private void datagrid1_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e)
{
    datagrid1.LostFocus += new RoutedEventHandler(datagrid1_LostFocus);
}

void datagrid1_LostFocus(object sender, RoutedEventArgs e)
{
    // hier ist dann code         
}


Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt


Kha - Mi 15.04.09 11:09

:welcome:

Hört sich so an, als ob das normalerweise auch ohne so einen Hack funktionieren sollte ;) .
Ich würde jedenfalls im Prepare-Eventhandler einem Klassenfeld den sender-Parameter zuweisen. Im LostFocus liest du dann dieses Feld aus und setzt es am Schluss auf null, damit jeder sender nur genau einmal verarbeitet wird.


_Joe_ - Sa 16.05.09 12:06

user profile iconticcoid hat folgendes geschrieben Zum zitierten Posting springen:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
private void datagrid1_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e)
{
    datagrid1.LostFocus += new RoutedEventHandler(datagrid1_LostFocus);
}

void datagrid1_LostFocus(object sender, RoutedEventArgs e)

  Dispatcher.BeginInvoke(delegate()
  {

    // hier ist dann code         
   });
}


Moderiert von user profile iconChristian S.: C#-Tags hinzugefügt


so sollte es klappen, wenn es überhaupt noch aktuell ist


Kha - Sa 16.05.09 13:08

Was hat denn der Dispatcher mit der Frage zu tun? Und auf den PreparingCellForEdit-Sender hast du so immer noch keinen Zugriff.
Wollte man es unbedingt mit Closures machen, dann am ehesten so:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
private void datagrid1_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e)
{
  RoutedEventHandler handler = null;
  handler = delegate {
    // hier sender verwenden
    datagrid1.LostFocus -= handler;
  };
  datagrid1.LostFocus += handler;
}

Naja, hab schon hübscheren Code gesehen ;) .