Question

Je recueille des données dans une tâche séparée et je veux des données lier le résultat à un composant d'interface graphique en utilisant un ObservableCollection<>. Donc, mon code ressemble à ceci:

private ObservableCollection<MyItem> _items;
public ObservableCollection<MyItem> Items
{
  get { return _items; }
  set
  {
    if (_items.Equals(value))
    {
      return;
    }
    _items = value;
    RaisePropertyChanged("Items");
  }
}

private void LoadData()
{
  Task task = Task.Factory.StartNew(() =>
  {
    ObservableCollection<MyItem> itms = _htmlParser.FetchData(...);

    Dispatcher.CurrentDispatcher.Invoke((Action)delegate
    {
      Items = itms;
    });
  });
}

Les données sont extraites d'un composant faisant des requêtes HTTP. L'erreur que je reçois est:
Must create DependencySource on same Thread as the DependencyObject.

J'utilise le cadre de Light Toolkit MVVM. J'ai aussi essayé d'envoyer le résultat comme un message, mais qui a fini dans le même message d'erreur. Toutes les idées ou des pointeurs?

EDIT: Voici la question:

public class MyItem
{
  public string Id { get; set; }
  public string Name { get; set; }
  public BitmapImage Image { get; set; }  // <--- A big No No because it inherits from the DependencyObject
  public Uri Uri { get; set; }
}

J'ai changé le BitmapImage à un type de données byte[].

Était-ce utile?

La solution

L'exception que vous obtenez ( « doit créer DependencySource sur un même fil que le DependencyObject ») indique avoir été créé sur un thread d'arrière-plan et utilisé sur le thread d'interface utilisateur de ce quelque chose. Y a-t-il des contrôles d'interface utilisateur créés et stockés dans la collection pour une utilisation par l'interface utilisateur?

Je vois que le ObservableCollection lui-même est en cours de création sur un fil de fond, mais je ne pense pas que ce soit la question - malheureusement je ne suis pas dans le bureau au code et confirmer que

.

Autres conseils

Pouvez-vous essayer de remplacer le Dispatcher.CurrentDispatcher en Application.Current.Dispatcher pas sûr de ce que

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top