Databinden von Bilden lockt diese- auch beim Clearen von DataSource


DrMueller

Erfahrenes Mitglied
#1
Hallo Leute,

mal ein Problem,welches bei einem privaten kleinen Projekt auftritt:
Ich mache eine Auswertung von einem Spiel, wo ich die Daten sowie die Icons runter lade und dann im Grid anzeige.
Binden tue ich dies wie folgt:

Code:
<GridViewColumn Header="" Width="40">
                                <GridViewColumn.CellTemplate>
                                    <DataTemplate>
                                        <Image Source="{Binding HeroIcon}" Width="24" Height="24"  />
                                    </DataTemplate>
                                </GridViewColumn.CellTemplate>
                            </GridViewColumn>
Runterladen, tue ich das Bild wie folgt:

Code:
            string file = Path.Combine(FileHandler.GetFilePath(ImagePath.Counters), Path.GetFileName(picture));

            File.Create(file).Dispose();

            using (WebClient client = new WebClient())
            {
                client.DownloadFile(picture, file);
            }
            result.HeroIcon = file;
Ich erstelle also eine leere Datei, welche ich gleich wieder dispose.
Dann lade ich das entsprechende File lokal runter. Dies klappt soweit alles gut, und die Bilder werden auch angezeigt, wenn ich allerdings erneut auf die Bilder zugreifen will, sind diese gelockt.
Ich dachte, ein einfaches clearen der DataSource und auch der Liste, sollte helfen, doch leider geht das nicht. Ich arbeite mit einem Backgroundworker, der während dem Download einfach einen Progressbar mit unbestimmer Länge anzeigt:

Code:
        void _backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            List<Hero> heros = null;
            try
            {
                string heroName = Convert.ToString(e.Argument);
                lsvHeros.Dispatcher.BeginInvoke(new Action(() => lsvHeros.ItemsSource = null));
                heros = CountersHandler.GetCounters(heroName);
            }
            catch (Exception ex)
            {
                heros = new List<Hero>();
            }
            finally
            {
                lsvHeros.Dispatcher.BeginInvoke(new Action(() => lsvHeros.ItemsSource = heros));
            }
        }
Ich versuche also das ganze mit CountersHandler.GetCounters zu laden, falls z.B. ein falscher Name eingegeben wurde, wird einfach nichts angezeigt. Leider gibt es eben den Fehler, dass die Bilder noch von einem Prozess verwendet werden.

Ich habe Lösungen gefunden, allerdings empfehlen diese dann, nicht direkt mit Binding zu arbeiten, was ja eigentlich schon recht elegant wäre.

Hat da jemand eine Idee? Wenn ich die Bilder nicht in das Grid lade, kann ich alles sauber löschen, daher muss es definitiv mit dem Binding zu tun haben.


Wie immer vielen Dank im Voraus

Matthias Müller
 

Spyke

Premium-User
#2
Was heißt erneutes zugreifen auf die Bilder?
Meinst du damit diese erneut runterladen?

Meine erste Vermutung wäre das die Datei zum beschreiben immer noch durch den Download gesperrt ist und ev. nur zum lesen freigegeben wurde, weshalb deine Anzeige der Bilder funktioniert.

Edit:
Sorry hab den letzten Satz nicht gelesen, hängt also doch anner Bindung.