CommandBinding-Error trotz Funktionalität

  • WPF

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von PadreSperanza.

    CommandBinding-Error trotz Funktionalität

    Hallo Leute,

    ich könnte mir echt die Haare raufen...

    ich bekomme ein Command-Binding-Error angezeigt. Aber wenn ich es ausführe, funktioniert dennoch alles tadellos, sodass das Binding (zumindest meiner Meinung nach) aufgelöst wird. Ich habe mittlerweile ein größeres Projekt und bin Binding-Error immer auf die Schliche gekommen, um zu verstehen, was das Problem ist. Aber diesen bekomme ich nicht weg, finde aber auch den Weg nicht. Angezeigt wird mir folgendes:
    System.Windows.Data Error: 40 : BindingExpression path error: 'SelectGroup' property not found on 'object' ''CollectionViewGroupInternal' (HashCode=5187119)'. BindingExpression:Path=SelectGroup; DataItem='CollectionViewGroupInternal' (HashCode=5187119); target element is 'CheckBox' (Name=''); target property is 'Command' (type 'ICommand')

    bemängelt wird folgender Code:

    XML-Quellcode

    1. <CheckBox DataContext="{StaticResource ViewNLSMembers}" Content="Alle auswählen"
    2. CommandParameter="{Binding ElementName=GroupName, Path=Text}" Command="{Binding SelectGroup, Mode=OneWay}"/>
    3. <Separator />


    welcher sich insgesamt hier befindet:

    XML-Quellcode

    1. <GroupStyle.ContainerStyle>
    2. <Style TargetType="{x:Type GroupItem}">
    3. <Setter Property="Template">
    4. <Setter.Value>
    5. <ControlTemplate>
    6. <Border BorderBrush="LightGray" BorderThickness="1" CornerRadius="10" Margin="5" Padding="10">
    7. <StackPanel>
    8. <TextBlock Text="{Binding Name}" x:Name="GroupName"/>
    9. <CheckBox DataContext="{StaticResource ViewNLSMembers}" Content="Alle auswählen"
    10. CommandParameter="{Binding ElementName=GroupName, Path=Text}" Command="{Binding SelectGroup, Mode=OneWay}"/>
    11. <Separator />
    12. <ItemsPresenter/>
    13. </StackPanel>
    14. </Border>
    15. </ControlTemplate>
    16. </Setter.Value>
    17. </Setter>
    18. </Style>
    19. </GroupStyle.ContainerStyle>



    in der View NLSMembers ist der Command wie folgt hinterlegt (ich stückle mal alle, was nichts damit zu tun hat):

    C#-Quellcode

    1. public ICommand SelectGroup { get; internal set; }
    2. SelectGroup = new RelayCommand(SelectGroupExecute);
    3. private void SelectGroupExecute(object obj)
    4. {
    5. NLSUnit unit;
    6. Enum.TryParse(Convert.ToString(obj), true,out unit);
    7. ListView listview = MainWindow.AppReference.FindName("OutlookListView") as ListView;
    8. foreach (NLSMember member in listview.Items)
    9. {
    10. if(member.Unit == unit && !listview.SelectedItems.Contains(member))
    11. {
    12. listview.SelectedItems.Add(member);
    13. }
    14. }
    15. }


    Wenn ich das Programm nun Debugge, bekomme ich wie gesagt, diesen Fehler angezeigt. Wenn ich nun aber auf die Checkbox klicke (alle auswählen), dann wählt er auch alle aus, die sich in der Gruppe befinden.
    Nun ist meine Frage, warum der Fehler, wenn scheinbar alles funktioniert. Und wie muss ich CollectionGroupViewInternal deuten?

    Also ich vermute, dass ich schon soweit scheinbar alles richtig mache (der Code funktioniert so, wie er soll), aber dass ich irgendeine Quintessenz vergessen habe, sodass intern das korrigiert wird, was ich verpatzt habe. Vielleicht kann mir ja jemand erklären, was es mit diesem GroupInternal auf sich hat :)
    Hallo

    Du hast wohl eine CollectionViewsSource in welcher du diesen Groupstyle hast. Zum Zeitpunkt der initialisierung ist der DatenKontext der Checkbox auf diese gebunden.
    Intern ist die Collection welche bei einer CollectionView zurückgegeben wird eine CollectionGroupViewInternal auf welche gebunden wird.

    Die Vermutung welche ich jetzt habe ich das sich des Datenkontext kurz darauf ändert und das Binding funktioniert.
    Das ist natürlich ärgerlich. Am besten kommt du dem auf die schliche indem du einen wie ich ihn gerne nenne "DebugConverter" baust.
    Du machst also einen simplen Converter welcher schlicht den Value weitergibt. Hierzu habe ich auch ein Beispiel in meiner Tutorialreihe.
    Der Vorteil für dich: Du kannst in dieser einen Zeile des Converters einen Haltepunkt setzen und kannst sohin zum einen sehen was nun als value kommt und zum anderen wie oft der Haltepunkt angelaufen wird. Ändert sich nämlich der Datenkontext wird der Code fürs Binding abermals durchlaufen.

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    ## Bitte markiere einen Thread als "Erledigt" wenn deine Frage beantwortet wurde. ##