Die Sammlung wurde geändert. Der Enumerationsvorgang kann möglicherweise nicht ausgeführt werden.

  • WPF
  • .NET (FX) 4.5–4.8

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von DTF.

    Die Sammlung wurde geändert. Der Enumerationsvorgang kann möglicherweise nicht ausgeführt werden.

    Kann mir jemand helfen ein Fehler beheben:

    Ich habe ein DataGrid, und wollte eine Variable haben, die mir anzeigt, ob die Zeile Selected ist. In WPF sieht das ungefähr so aus:

    XML-Quellcode

    1. <Style BasedOn="{StaticResource {x:Type DataGridRow}}" TargetType="{x:Type DataGridRow}">
    2. <Setter Property="Background" Value="WhiteSmoke"/>
    3. <Setter Property="Foreground" Value="Gray"/>
    4. <Setter Property="FontWeight" Value="Bold"/>
    5. <Setter Property="Margin" Value="0,0,0,0"/>
    6. <Setter Property="IsSelected" Value="{Binding IsSelected, FallbackValue=False, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />
    7. </Style>


    Und es schmiert mir ab und zu ab, wenn ich die Zeile hier drin behalte:

    XML-Quellcode

    1. <Setter Property="IsSelected" Value="{Binding IsSelected, FallbackValue=False, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" />


    Hatte einer schon mal so ein Problem?
    Falsche herangehensweise. Klickst du im DataGrid auf eine Zeile wird sie von allein "IsSelected".

    Willst du nun einen speziellen Style haben für die Selektierte Zeile, dann nutze Style-Trigger.

    XML-Quellcode

    1. <Style TargetType="{x:Type DataGridRow}">
    2. <Style.Triggers>
    3. <Trigger Property="IsSelected" Value="True">
    4. <Setter Property="Background" Value="Goldenrod"/>
    5. </Trigger>
    6. </Style.Triggers>
    7. </Style>


    Edit @EugenIS

    Binde das SelectedItem, jetzt beim 2. durchlesen hab ich das verstanden, schau dir vom DataGrid mal SelectedItem an.

    XML-Quellcode

    1. SelectedItem="{Binding DeineSelectedItemProperty}"

    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

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

    nein nein, es geht nicht um Background oder Style. Ich habe einen Button, der durch die Property mitzählt wie viele Items zum löschen markiert sind.

    ​Binde das SelectedItem, jetzt beim 2. durchlesen hab ich das verstanden, schau dir vom DataGrid mal SelectedItem an.


    Ich binde an sich überhaupt kein SelectedItem.

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

    Jetzt ist der Groschen nun wirklich gefallen, du brauchst alle Selektierten Items, da schau ich eben mal, bisher hatte ich nur mit Selectionmode Single gearbeitet(bin noch recht neu in WPF), da hat es gereicht das SelectedItem zu binden. Ich sag Bescheid wenn ich das hab, werde das auch bald brauchen.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D
    Ja genau, ich hab eine Liste, und die hat Items mit einem IsSelected drin. Immer wenn welche markiert sind, möchte ich, dass unten der Button Anzahl zum löschen anzeigt. (Löschen [5]) oder so...

    Mach Dir aber nicht zu viel Umstände, ich wollte nur wissen, ob jemand auf das selbe Problem schon mal gestoßen ist. Normallerweise kommt so etwas wenn man die Liste ändert und eine schleife von 0 nach n laufen lässt. Bei mir sind alle schleifen aber von n nach 0 aber den Trigger kann ich nicht beeinflussen. Deswegen hab ich so ein Problem.
    Ach Umstände sind das nicht, ich werde das bald brauchen, das dann schon zu können ich doch nicht falsch. Ich hab da schon eine Theorie, die werde ich testen.




    So @EugenIS, ich habs. War zum Glück nicht schwer. Ich ärgere mich das ich mich so lange vor WPF gedrückt hab(weil nicht verstanden), aber nun scheint es wirklich klick gemacht zu haben.

    RelayCommand und Notifyable sollten klar sein, sonst schaut in der Mappe im Anhang.
    TestModel

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using System.Threading.Tasks;
    6. namespace Selectiontest
    7. {
    8. public class TestModel : Notifyable
    9. {
    10. public TestModel()
    11. {
    12. }
    13. private string var1;
    14. public string Var1 { get => var1; set { var1 = value; RaisePropertyChanged(nameof(Var1)); } }
    15. private string var2;
    16. public string Var2 { get => var2; set { var2 = value; RaisePropertyChanged(nameof(Var2)); } }
    17. private bool isSelected = false;
    18. public bool IsSelected { get => isSelected;set { isSelected = value; RaisePropertyChanged(nameof(IsSelected)); } }
    19. }
    20. }

    MainWindowViewModel

    C#-Quellcode

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Collections.ObjectModel;
    4. using System.Diagnostics;
    5. using System.Linq;
    6. using System.Text;
    7. using System.Threading.Tasks;
    8. namespace Selectiontest
    9. {
    10. public class MainWindowViewModel : Notifyable
    11. {
    12. private ObservableCollection<TestModel> models = new ObservableCollection<TestModel>();
    13. public ObservableCollection<TestModel> Models { get => models; set{ models = value; RaisePropertyChanged(nameof(Models)); } }
    14. public RelayCommand ButtonClicked { get; set; }
    15. public RelayCommand AddItemsClicked { get; set; }
    16. public MainWindowViewModel()
    17. {
    18. ButtonClicked = new RelayCommand((o) => true, (o) => OnButtonClicked());
    19. AddItemsClicked = new RelayCommand((o) => true, (o) => OnAddItemsClicked());
    20. }
    21. private void OnAddItemsClicked()
    22. {
    23. for (int i = 0; i < 10; i++)
    24. {
    25. TestModel m = new TestModel();
    26. m.Var1 = i.ToString();
    27. m.Var2 = (i * i).ToString();
    28. models.Add(m);
    29. }
    30. RaisePropertyChanged(nameof(Models));
    31. }
    32. private void OnButtonClicked()
    33. {
    34. List<TestModel> selectedModels = Models.Where((o) => o.IsSelected).ToList();
    35. Debug.WriteLine (selectedModels.Count);
    36. }
    37. }
    38. }

    MainWindow

    XML-Quellcode

    1. <Window x:Class="Selectiontest.MainWindow"
    2. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    3. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    6. xmlns:local="clr-namespace:Selectiontest"
    7. mc:Ignorable="d"
    8. Title="MainWindow" Height="450" Width="800">
    9. <Window.DataContext>
    10. <local:MainWindowViewModel/>
    11. </Window.DataContext>
    12. <Grid>
    13. <Grid.RowDefinitions>
    14. <RowDefinition Height="Auto"/>
    15. <RowDefinition/>
    16. </Grid.RowDefinitions>
    17. <Grid.ColumnDefinitions>
    18. <ColumnDefinition/>
    19. <ColumnDefinition/>
    20. </Grid.ColumnDefinitions>
    21. <Button Content="Add Items" Command="{Binding AddItemsClicked}"/>
    22. <Button Grid.Column="2" Content="Click me gently" Command="{Binding ButtonClicked}"/>
    23. <DataGrid Grid.Row="1" Grid.ColumnSpan="2" ItemsSource="{Binding Models}" CanUserAddRows="False" CanUserDeleteRows="False" AutoGenerateColumns="False">
    24. <DataGrid.Columns>
    25. <DataGridTextColumn Header="Var1" Binding="{Binding Var1}"/>
    26. <DataGridTextColumn Header="Var2" Binding="{Binding Var2}"/>
    27. </DataGrid.Columns>
    28. <DataGrid.RowStyle>
    29. <Style TargetType="DataGridRow">
    30. <Setter Property="IsSelected" Value="{Binding Path=IsSelected, Mode=TwoWay}" />
    31. <Style.Triggers>
    32. <Trigger Property="IsSelected" Value="True">
    33. <Setter Property="Background" Value="Green" />
    34. </Trigger>
    35. </Style.Triggers>
    36. </Style>
    37. </DataGrid.RowStyle>
    38. </DataGrid>
    39. </Grid>
    40. </Window>


    Beiträge zusammengefasst ~VaporiZed
    Dateien
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

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

    Bedenke das dieses Beispiel für MVVM gedacht ist, falls du dieses Pattern nicht anwendest, kannst du das mit dem ViewModel und den RelayCommands weglassen. Statt den RelayCommands dann die Standard RoutedCommands. Bau am besten eine ICollectionView ein mit Filter, da kannst du dann auf IsSelected prüfen.
    Zitat von mir 2023:
    Was interessiert mich Rechtschreibung? Der Compiler wird meckern wenn nötig :D

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