Eigene Events - Verständnisproblem?

  • WPF

Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Eigene Events - Verständnisproblem?

    Hallo,

    ich habe bisher nix mit eigenen Events gemacht. Mein erster Ansatz funktioniert nicht. Im Moment sehe ich keinen Fehler.

    Das Projekt besteht aus zwei WPF-Fenster mit zugehörigem Viewmodel.

    Klasse 1 (Hauptfenster):

    C#-Quellcode

    1. public class MainWindowViewModel {
    2. public class MainWindowEventArgs :EventArgs {
    3. public int Wert { get; set; }
    4. public MainWindowEventArgs() {
    5. }
    6. }
    7. public delegate void MainWindowEventHandler(object s, MainWindowEventArgs e);
    8. public event MainWindowEventHandler EventHandler;
    9. public MainWindowViewModel() {
    10. EventHandler += MainWindowViewModel_EventHandler;
    11. }
    12. public void Weiter() {
    13. var o = new SubWindow();
    14. o.Show();
    15. }
    16. private void MainWindowViewModel_EventHandler(object s, MainWindowEventArgs e) {
    17. MessageBox.Show($"Der Wert ist {e.Wert}");
    18. }
    19. }



    Klasse 2:

    C#-Quellcode

    1. public class SubWindowViewModel {
    2. public SubWindowViewModel() {
    3. }
    4. public event MainWindowViewModel.MainWindowEventHandler LocalEvent;
    5. public void DoIt() {
    6. var e = new MainWindowViewModel.MainWindowEventArgs(){
    7. Wert= 42
    8. };
    9. LocalEvent.Invoke(this, e);
    10. }
    11. }


    LocalEvent ist null. Soweit ich verstanden habe, ist LocalEvent solange null, bis sich eine Klasse für das Event einschreibt. Das Hauptfenster hat sich für das Event registriert aber das scheint nicht ausreichend.

    Wenn ich mir Beispiele anschaue, dann rufen übergeordnete Klassen die EventHandler untergeordneter Klassen auf. Ich brauche es aber andersrum. Konkret geht es darum, dass im Hauptfenster ein TabControl-Element sitzt und Events von den untergeordneten TabItems empfangen soll. Die TabItems sind alle unterschiedlichen Typs (UserControls).

    Wie setzt man denn sowas um?

    Gruß

    MQ

    --EDIT:--

    Sender und Empfänger verwechselt. Subwindow muss sich für das Event des MainWindow registrieren und nicht ummekehrt!

    C#-Quellcode

    1. public class MainWindowViewModel {
    2. public class MainWindowEventArgs :EventArgs {
    3. public int Wert { get; set; }
    4. public MainWindowEventArgs() {
    5. }
    6. }
    7. public delegate void MainWindowEventHandler(object s, MainWindowEventArgs e);
    8. public MainWindowViewModel() {
    9. }
    10. public void Weiter() {
    11. var o = new SubWindow();
    12. o.vm.LocalEvent += LocalEventHandler;
    13. o.Show();
    14. }
    15. private void LocalEventHandler(object s, MainWindowEventArgs e) {
    16. MessageBox.Show($"Der Wert ist {e.Wert}");
    17. }
    18. }


    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „MasterQ“ ()

    MasterQ schrieb:

    Konkret geht es darum, dass im Hauptfenster ein TabControl-Element sitzt und Events von den untergeordneten TabItems empfangen soll. Die TabItems sind alle unterschiedlichen Typs (UserControls).
    Das scheint mir der Philosophie von WPF zu widersprechen.
    Ein TabControl-Element sollte keine Events empfangen.
    Irgendetwas anderes - Daten - sind miteinander verknüpft - haben direkten Zugriff oder empfangen Events.
    Daran kann einer Wpf-Oberfläche - auch mit TabControls - gebunden sein.
    Du solltest also über deine Daten nachdenken und sprechen - nicht über TabControls.

    Edit: Achso - dein zweites Snippet soll vlt. die Lösung sein. Da kommt ein TabControl ja nicht mehr vor - na schön.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()