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.
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:
XAML-Deklaration:
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.
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>