WPF - Probleme mit DataGrid bei Verwendung von CellTemplate

GinoBambino

Lt. Commander
Registriert
Sep. 2012
Beiträge
1.063
Ich bin seit Stunden auf der Suche nach einer Lösung für mein Problem. Ich habe ein Custom-TabControl erstellt, das eine Collection von TabItem-ViewModels zugewiesen bekommt. Die TabItem-ViewModels haben eine Header- und eine Content-Property. In die Content-Property wird ein weiteres VM ("AnfragenViewModel") abgelegt wird.

Damit das TabItem-Content-VM ("AnfragenVM") mit einer View verknüpft wird, habe ich zusätzlich ein DataTemplate in meiner MainWindow-XAML-Deklaration hinzugefügt. Die View besteht lediglich aus einem UserControl, das ein DataGrid darstellt. In einer der DataGrid-Spalten habe ich ein TemplateColumn definiert, um eine ComboBox anzuzeigen, die beim Ändern der Auswahl ein Command ("SaveCommand") in meinem VM auslöst.

Screen.png

Um dies zu erreichen, habe ich der ComboBox in der Template-Definition die Attached Property "SelectorBehavior" zugewiesen.

Nun zum Problem:

Wechsele ich zwischen mehreren Tabs, kommen die gebundenen ComboBox-Werte völlig durcheinander. Die ComboBoxen geben plöztlich ganz andere Werte als selektiert an als es eigentlich der Fall ist. Gleichzeitig wird Zeile für Zeile das SelectionChanged-Event gefeuert und infolgedessen das Save-Command aufgerufen.

Ich habe einen kleinen Workaround entdeckt. Dieser besteht darin, in die "Content"-Property des TabItem-VMs direkt eine View zu injizieren (anstelle eines VMs), sodass jedes TabItem-VM eine separate View-Instanz mit sich führt. Weil dieser Ansatz funktioniert, ist meine Vermutung, dass die WPF für die verschiedenen TabItem-VMs (bzw. für deren Content-VMs) nur ein einziges View-Objekt benutzt. Dieses kommt dann wohl beim Tab-Wechsel durcheinander.

Auch wenn es funktioniert, so läuft dieser Ansatz den MVVM-Prinzipien zuwider. Deshalb suche ich nach einer vernünftigen Lösung. Wäre super, wenn mir jemand helfen könnte :)


SelectorBehavior:
PHP:
 Private Shared Sub Selector_SelectionChanged(sender As DependencyObject, e As SelectionChangedEventArgs)
        Dim selector As Selector = sender

        If Not IsNothing(selector) Then
            Dim command As ICommand = selector.GetValue(SelectorBehavior.SelectionChangedBehavior)

            If command.CanExecute(selector.SelectedItem) Then
                command.Execute(selector.SelectedItem)
            End If
        End If
    End Sub

XAML-Deklaration:

PHP:
<DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ComboBox
                                app:SelectorBehavior.Command="{Binding DataContext.SaveCommand, ElementName=DataGrid}"
                                Name="ComboBox">
                                <ComboBox.ItemsSource>
                                    <Binding
                                        ElementName="DataGrid"
                                        Path="DataContext.StatusCodes" />
                                </ComboBox.ItemsSource>
                                <ComboBox.SelectedItem>
                                    <Binding
                                        Path="StatusCode"
                                        Mode="TwoWay"
                                        UpdateSourceTrigger="Default" />
                                </ComboBox.SelectedItem>
                                <ComboBox.DisplayMemberPath>Label</ComboBox.DisplayMemberPath>
                                <ComboBox.Style>
                                    <Style
                                        TargetType="{x:Type ComboBox}">
                                        <Style.Setters>
                                            <Setter
                                                Property="Background"
                                                Value="Transparent" />
                                            <Setter
                                                Property="BorderBrush"
                                                Value="{x:Null}" />
                                            <Setter
                                                Property="BorderThickness"
                                                Value="0" />
                                        </Style.Setters>
                                    </Style>
                                </ComboBox.Style>
                            </ComboBox>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
 
Zurück
Oben