TabControl SelctedIndex über VM ändern nur bei Header Doppelklick

  • WPF

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    TabControl SelctedIndex über VM ändern nur bei Header Doppelklick

    Hallo Experten,

    ich habe eine TabControl als Hauptansicht.
    Auf dem ersten Tabitem liegt ein weiterer TabControl als Usercontrol (um den geht es hier)
    Der besteht aus zwei TabItems:
    Ein DataGrid als Master und eine TextBox-Konstrukt als Detail / Bearbeitungsansicht (beide wieder als Usercontrols eingebunden).

    Ich möchte mit einem Doppelklick auf eine Zeile des DataGrids aud den zweiten Tab (Detail) umschalten.
    Der SelectedIndex des Tabs ist an eine SelectedTabIndex Proberty meines VM's gebunden

    XML-Quellcode

    1. SelectedIndex="{Binding SelectedTabIndex, Mode=TwoWay}">


    In der DataGrid Definition habe ich einen Interaction.Trigger definiert.

    XML-Quellcode

    1. <i:Interaction.Triggers>
    2. <i:EventTrigger EventName="MouseDoubleClick">
    3. <mvvmlight:EventToCommand Command="{Binding dgRowDoubleClick}" PassEventArgsToCommand="True" />
    4. </i:EventTrigger>
    5. </i:Interaction.Triggers>


    In meinem ViewModel gibt es die entsprechenden Propertys

    VB.NET-Quellcode

    1. Public Property SelectedTabIndex As Integer = 0
    2. Public Property dgRowDoubleClick As RelayCommand(Of MouseButtonEventArgs)
    3. Public Sub New()
    4. ...
    5. dgRowDoubleClick = New RelayCommand(Of MouseButtonEventArgs)(Sub(e)
    6. If SelectedFirma IsNot Nothing Then
    7. SelectedTabIndex = 1
    8. End If
    9. End Sub)
    10. End Sub


    Das Problem:
    Nur bei einem Doppelklick auf den Header des DataGrids wird euf den zweiten Tab umgeschaltet.
    Ein Breakpoint auf "SelectedTabIndex = 1" zeigt aber, auch bei einem Row-Click wird das Property geändert.
    Nur hat das keinen Effekt. Das TabControl bleibt auf TabItem 0.
    Ich nutze MVVMLight

    Woran kann das liegen ?

    Danke für die Anregungen
    Das Viewmodel muss INotifyPropertyChanged implementieren, und die SelectedTabIndex-Property muss dann das Propertychanged-Event mit dem richtigen P-EventArgs feuern.
    Das ist eines der Grundprinzipien von WPF, und weil das so viel verwendet wird, bietet MVVMLight auch eine Basisklasse Viewmodelbase an, von der man die INotifyPropertyChanged-Implementation schoma erben kann.
    Allerdings das Auslösen kann man nicht erben, das muss tatsächlich im Setter der Properies stattfinden - die Property-Kurz-schreibe-Syntax taugt dafür nicht.
    Beachte auch, dass der Setter immer erst den neuen Wert auf Neuheit testen sollte, um nicht unnötige Events auszulösen, wenn sich garnix ändert.
    Ich nutze fody propertxchanged. Das hatte ich vergessen zu erwähnen.
    Ich habe einen Haltepunkt auf Zeile 8 des VB-Schnipsels gesetzt. Der wird sowohl beim Doppelklick auf eine Zeile des Datagrids als auch beim Doppelklic auf den Header des Datagrids erreicht.
    Die Zeile 8 (in einer seperaten Sub der gleiche Effekt) wird ausgeführt,also SelectedTabIndex wird geändert.
    Das SelectedItem im gleichen VM wird beim Klick auf eine Row geändert. Das sagt mir die Impementierung sollt stimmen. Zumal ich ein MVVMLight Beispiel (mit ähnlicher Grundfunktion)
    als Grundlage überarbeitet habe.
    Die Frage ist doch welchen funktionalen Unterschied gibt zwischen Doppelklick auf Headerzeile und DataGridRow.
    Warum wird bei HeaderDoubleClick der SelectedIndes des TabControl geändert, bei RowDoubleClick nicht?
    also die zeile#8 wird durchlaufen sowohl bei DG-Header-DoubleClick als auch bei DG-Row-DoubleClick?

    Und bei DG-Header-DoubleClick funktionierts wie gewünscht, aber bei DG-Row-DoubleClick nicht?

    Mysteriös
    Kannst du ein Sample basteln und anhängen, was den Fehler reproduziert?
    Aber lieber ohne Fody, es sei denn, Fody funzt auch ohne zusätzliche Installation im System.


    Es ist schon ein bisschen her, aber da ich es selbst nicht mag, nach einer Recherche Fragen ohne Antwort zu finden, hier noch die Lösung des Problems.
    Der oben beschriebene Code ist völlig korrekt und vollständig. Allerdings scheint der Doppelklick auf das DataGrid (und damit auch auf den TabItem) noch andere
    Ereignisse auszulösen, die dann der TabItemChange entgegenwirken. Nach einiger Suche hab ich's mit einem Timer gelöst

    VB.NET-Quellcode

    1. Dim switchTabTimer As New DispatcherTimer()
    2. Sub New()
    3. switchTabTimer.Interval = New TimeSpan(0)
    4. AddHandler switchTabTimer.Tick, Sub(timerSender As Object, timerE As EventArgs)
    5. selectedStammDatTabIdx = _newStammDatTabIdx
    6. switchTabTimer.Stop()
    7. End Sub)
    8. ' Die Eventanbindung sieht dann so aus:
    9. dgRowDoubleClick = New RelayCommand(Of MouseButtonEventArgs)(Sub()
    10. _newTabIdx = 1
    11. switchTabTimer.Start()
    12. End Sub)
    13. End Sub

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Jo_Ga“ ()