it-swarm.com.de

Ein ItemsControl ist inkonsistent mit seiner Elementquelle - WPF Listbox

Ich habe ein WPF-Fenster mit einem ListBox-Steuerelement, das gefüllt wird, wenn eine Button-Click-Methode ausgeführt wird.

XAML:

<ListBox Name="ThirdPartyListBox" ItemsSource="{Binding}" Margin="0,70,0,0">                      
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <Image Source="C:\Users\Test\Desktop\Project\ACME-WPF\ACME-WPF\window-new-3.ico" Margin="5" Width="50"/>
                                <Button Name="ThirdPartyInstallButton" Content="Install" Click="InstallThirdPartyUpdatesButton_Click" Margin="5,5,0,0" Height="25"></Button>
                                <Button Name="ThirdPartyPostoneButton" Content="Postpone" Click ="PostponeThirdPartyUpdatesButton_Click" Margin="5,5,0,0" Height="25"></Button>
                                <TextBlock FontWeight="Bold" Text="{Binding Item2.Name}" Margin="12,25,0,0"/>
                                <TextBlock FontWeight="Bold" Text="{Binding Item2.RequiredVersion}" Margin="3,25,0,0"/>
                                <TextBlock Text="{Binding Item2.CustomUIMessage}" Margin="10,25,0,0" TextWrapping="Wrap" Foreground="Red"/>
                                <TextBlock Text="You have used " Margin="3,25,0,0"/>
                                <TextBlock Text="{Binding Item3.UsedDeferrals}" Margin="3,25,0,0"/>
                                <TextBlock Text=" of " Margin="3,25,0,0"/>
                                <TextBlock Text="{Binding Item2.MaxDefferals}" Margin="3,25,0,0"/>
                                <TextBlock Text=" deferrals for this update." Margin="3,25,0,0"/>
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

C #:

 private void CheckforThirdPartyUpdatesButton_Click(object sender, RoutedEventArgs e)
    {
        CheckforThirdPartyUpdatesButton.IsEnabled = false;

        worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true;
        worker.WorkerSupportsCancellation = true;

        worker.DoWork += delegate(object s, DoWorkEventArgs args)
        {
            MainEntry.checkFor3PUpdates();
        };

        worker.ProgressChanged += delegate(object s, ProgressChangedEventArgs args)
        {

        };

        worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
        {

            ThirdPartyListBox.DataContext = RegScan_ThirdParty.comparisonListWithState;
            CheckforThirdPartyUpdatesButton.IsEnabled = true;
        };

        worker.RunWorkerAsync();
    }

Alles bis zu diesem Punkt funktioniert wie erwartet und das Listenfeld wird mit mehreren Elementzeilen aufgefüllt, abhängig davon, wie viele Elemente sich in der Liste ThirdPartyListBox.DataContext = RegScan_ThirdParty.comparisonListWithState; befinden. Wenn ich jedoch überhaupt mit den Listenfeldelementen interagiere, wird eine InvalidOperationException mit der inneren Ausnahme ausgelöst "Ein ItemsControl stimmt nicht mit seiner Elementquelle überein."

Kann mir jemand helfen zu verstehen, was passiert?

17
user3342256

Solche Ausnahmen werden ausgelöst, wenn sich die Quelle eines Elements von einem anderen Thread geändert hat und ListBox keine Benachrichtigung (CollectionChanged-Ereignis) über die Änderung von ItemsSource erhält. Wenn also etwas anfängt (wie das Aktualisieren des Layouts), wird festgestellt, dass Items nicht gleich ItemsSource ist und eine Ausnahme auslöst.

Seit .NET 4.5 bietet WPF eine Möglichkeit, die Synchronisierung mit einer Auflistung zu aktivieren, die von verschiedenen Threads geändert wird. Versuchen Sie, die EnableCollectionSynchronization -Methode für Ihre ItemsSource zu verwenden.

23
neptunao

Sie können die Refresh () -Methode auf Ihrem Steuerelement einfach aufrufen, wenn die Bindungsressourcen geändert wurden:

myListBox.Items.Refresh();
11
Dragon

Ich habe dieselbe Fehlermeldung erhalten, weil ich eine Liste mit UI-Bindungen mehrere Male (Schleife) in einer einzigen Methode gelöscht und aktualisiert habe.

Die Lösung bestand darin, eine temporäre Liste zu erstellen und die neue Liste nur einmal zuzuweisen.

Nicht direkt dein Problem, aber derselbe Fehler, also dachte ich, ich werde es hier erwähnen ...

0
CodingYourLife